我在类的构造函数中初始化动态bitset,然后调用该类的方法以使用某些值填充它。无论我尝试访问哪个位集,我都会遇到分段错误。
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方法时它会产生段错误。
我检查了这个question,但我认为不适用,bc我正确构造了bitset,因为我看到了构造函数的正确输出。
如果我只是让方法fill_occupancy()接受类型dynamic_bitset&lt;&gt;类型的参数,我找到了一种方法使其工作。然后用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()
。
我的原始构造使占用成为与成员1同名的局部变量,因此在它工作的构造函数中,但在其他地方调用成员(大小为0)来解释段错误。
再次感谢juanchopanza的解释。
答案 0 :(得分: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();
}
答案 1 :(得分:0)
在您的代码中,“占用”是一个区域设置变量,因此您不应该在外部访问它。