Я инициализирую динамический набор битов в конструкторе класса, а затем вызываю метод этого класса, чтобы заполнить его некоторыми значениями. Я получаю ошибку сегментации независимо от того, к какой части набора я пытаюсь получить доступ.
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 за объяснения.
Конструктор создает местный Битсет называется occupancy
, а не член данных с тем же именем:
boost::dynamic_bitset<> occupancy(200000); // local variable
Кажется, вы хотите инициализировать элемент данных, что вы можете сделать так:
MyClass::MyClass(): occupancy(200000)
{
std::cout << occupancy.size() << "\n";
std::cout << occupancy[1234] << "\n";
fill_occupancy();
}
В вашем коде «размещение» — это переменная локали, поэтому вы не должны обращаться к ней снаружи.