簡體   English   中英

從其他方法初始化和調用的動態位集導致分段錯誤

[英]dynamic bitset initialized and called from other method gives segmentation fault

我在類的構造函數中初始化動態位集,然后調用該類的方法以將其填充一些值。 無論我嘗試訪問位集的哪一部分,都會遇到分段錯誤。

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提供的解釋。

構造函數實例稱為本地位集合occupancy ,名字不一樣的數據成員:

boost::dynamic_bitset<> occupancy(200000); // local variable

似乎您想初始化一個數據成員,您可以這樣執行:

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

在您的代碼中,“ occupancy”是一個語言環境變量,因此您不應在外部訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM