我在一个类的构造函数中初始化一个动态位集,然后调用该类的一个方法来用一些值填充它。无论我尝试访问 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 方法时,它给出了段错误。
我检查了这个问题,但我认为这不适用,因为我看到了构造函数的正确输出,所以我正确地构造了位集。
如果我简单地让方法 fill_occupancy() 接受 dynamic_bitset<> 类型的参数,然后用 fill_occupancy(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
}
然后 occupancy 具有正确的大小并且是 MyClass 的成员,因此可以从类的任何其他方法访问,例如fill_occupancy()
.
我最初的构造使占用成为与成员同名的局部变量,因此在构造函数中它起作用,但在其他任何地方都调用了成员(大小为 0),这解释了段错误。
再次感谢 juanchopanza 的解释。