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

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

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 за объяснения.

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам