动态bitset初始化并从其他方法调用给出了分段错误

时间:2014-07-25 05:32:07

标签: c++ boost segmentation-fault boost-dynamic-bitset

我在类的构造函数中初始化动态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的解释。

2 个答案:

答案 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)

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