C++ 初始化动态位集并从其他方法调用会导致分段错误

C++ 初始化动态位集并从其他方法调用会导致分段错误,c++,boost,segmentation-fault,boost-dynamic-bitset,C++,Boost,Segmentation Fault,Boost Dynamic Bitset,我在一个类的构造函数中初始化一个动态位集,然后调用该类的一个方法,用一些值填充它。无论我尝试访问位集的哪个部分,我都会遇到分段错误 MyClass::MyClass() { boost::dynamic_bitset<> occupancy(200000); // all 0's by default std::cout << occupancy.size() << "\n"; std::cout << occupancy[1234]

我在一个类的构造函数中初始化一个动态位集,然后调用该类的一个方法,用一些值填充它。无论我尝试访问位集的哪个部分,我都会遇到分段错误

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";
}
占用率设置为零时产生错误。要调整大小,必须调用

MyClass::MyClass()
{ 
  occupancy.resize(200000); // this is CORRECT
}
然后Occupation具有正确的大小,并且是MyClass的成员,因此可以从该类的任何其他方法访问,例如
fill\u occcupation()

我最初的构造使占用率成为与成员1同名的局部变量,因此在构造函数中它起作用,但在其他任何地方都调用了成员(大小为0),这就解释了segfault


再次感谢juanchopanza的解释。

构造函数正在实例化名为
占用率的本地位集,而不是同名的数据成员:

boost::dynamic_bitset<> occupancy(200000); // local variable
boost::动态_位集占用率(200000);//局部变量
您似乎想要初始化一个数据成员,您可以这样做:

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

std::cout在您的代码中,“占用率”是一个区域设置变量,因此您不应该在外部访问它。

谢谢,但是如果我想根据一些其他参数在构造函数本身中设置占用大小,该怎么办?这实际上就是我使用动态位集而不是std::位集的原因。@jano然后这样做。但是您的代码没有显示您想要做的事情,因此很难执行回答准确。好的,我学到了一个教训:我能做的就是使用上面提到的构造juanchopanza,如果需要,我可以调用
occupation.resize(其他一些)
获取我想要的大小。据我所知,我的原始表单适用于其他变量类型(如int)的原因是因为在MyClass声明中,dynamic\u位集调用默认构造函数,因此位集设置为大小0,然后在MyClass构造函数中,$boost::dynamic\u位集占用率(200000);$被解释为具有相同名称的局部变量。但是对于例如int变量,我不必设置大小,因此在类构造函数中更改其值只会对数据成员起作用。是吗?是的,代码没有显示这一点,很抱歉,我没有意识到这可能是个问题。您正确回答了问题ed,它帮助我找到了我想问的问题的答案:)非常感谢。不完全是这样;如果你在类的构造函数中设置了a=5,只要你在class.h文件中声明了它,那么你就可以在所有类方法中访问a。@jano那么它就不是局部变量。
占用率
是你代码中的局部变量。有关于那件事,我没有含糊不清的地方。
boost::dynamic_bitset<> occupancy(200000); // local variable
MyClass::MyClass(): occupancy(200000)
{ 
  std::cout << occupancy.size() << "\n";
  std::cout << occupancy[1234] << "\n";
  fill_occupancy();
}