динамический набор битов, инициализированный и вызванный из другого метода, дает ошибку сегментации

Я инициализирую динамический набор битов в конструкторе класса, а затем вызываю метод этого класса, чтобы заполнить его некоторыми значениями. Я получаю ошибку сегментации независимо от того, к какой части набора я пытаюсь получить доступ.

MyClass::MyClass()
{
boost::dynamic_bitset<> occupancy(200000); // all 0's by default
std::cout << occupancy.size() << "\n";
std::cout << occupancy[1234] << "\n";
fill_occupancy();
}

void MyClass::fill_occupancy()
{
std::cout << occupancy[1234] << "\n";
}

Конструктор выводит правильные выходные данные 200000 и 0, но когда входит в метод fill_occupancy, он выдает segfault.

Я проверил это вопрос, но я не думаю, что это применимо, потому что я правильно создаю набор битов, так как вижу правильный вывод из конструктора.

Я нашел способ заставить его работать, если я просто заставлю метод fill_occupancy () принимать аргумент типа dynamic_bitset<> а затем вызвать его с помощью fill_occupancy (размещение). Почему это работает, а код выше нет? Другие типы данных, которые я могу вызывать в других методах, не используя их в качестве аргумента.

Спасибо.

редактировать
Это на тот случай, если кому-то будет интересно более подробное объяснение:

class MyClass()
{
boost::dynamic_bitset<> occupancy; //calls default bitset constructor (i.e size 0)
}

В конструкторе MyClass, просто вызывая

MyClass::MyClass()
{
occupancy(200000); // this is WRONG
}

выдает ошибку, поскольку занятость установлена ​​в нулевой размер. Чтобы изменить его размер нужно позвонить

MyClass::MyClass()
{
occupancy.resize(200000); // this is CORRECT
}

Тогда размещение имеет правильный размер и является членом MyClass, и к нему можно получить доступ из любого другого метода класса, такого как fill_occupancy(),

Моя первоначальная конструкция делала заполнение локальной переменной с тем же именем, что и у члена, поэтому в конструкторе она работала, но везде был вызван член (размером 0), который объясняет segfault.

Еще раз спасибо juanchopanza за объяснения.

0

Решение

Конструктор создает местный Битсет называется occupancy, а не член данных с тем же именем:

boost::dynamic_bitset<> occupancy(200000); // local variable

Кажется, вы хотите инициализировать элемент данных, что вы можете сделать так:

MyClass::MyClass(): occupancy(200000)
{
std::cout << occupancy.size() << "\n";
std::cout << occupancy[1234] << "\n";
fill_occupancy();
}
2

Другие решения

В вашем коде «размещение» — это переменная локали, поэтому вы не должны обращаться к ней снаружи.

0

По вопросам рекламы [email protected]