0

我在一个类的构造函数中初始化一个动态位集,然后调用该类的一个方法来用一些值填充它。无论我尝试访问 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 的解释。

4

2 回答 2

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();
}
于 2014-07-25T05:34:18.683 回答
0

在您的代码中,“occupancy”是一个语言环境变量,因此您不应在外部访问它。

于 2014-07-25T06:31:44.967 回答