[英]boost circular buffer in stl vector crashes in release
我有一個在其中定義循環緩沖區的類,如下所示:
class cTest
{
public:
boost::circular_buffer<std::vector<std::pair<double, double>>> circDat;
cTest() : circDat(1000)
{
}
};
然后,我創建一個cTest類型的stl向量
std::vector<cTest> vC;
之后,我嘗試像這樣填充向量:
for (unsigned int i = 0; i < 4; ++i)
{
cTest obj;
vC.push_back(obj);
}
在Debug模式下運行時,在Release中會崩潰(有時,當我從Visual Studio中運行時,會收到Heap Corruption消息)。 boost文檔提到,在“調試”模式下,未初始化的內存填充有“ 0xcc”。 我認為,我得到的錯誤的根源是未初始化的內存。 但是我不確定如何解決此問題。
如果使用指針,它似乎可以工作:
std::vector<cTest*> vC;
for (unsigned int i = 0; i < 4; ++i)
{
cTest* obj = new cTest;
vC.push_back(obj);
}
但是我仍然不知道第一個版本的問題是什么。 如果有人知道,我將非常感謝您的幫助。
編輯:
我試圖創建一個最小的,可復制的代碼,但是失敗了。 它似乎也隨機崩潰,與添加/刪除的行並沒有真正的關聯。 然后我偶然發現了Visual Studio 2015中的/ GL標志。
關閉/ GL標志之后(在GUI項目中-它可以在庫項目中保持打開狀態),我無法重新創建崩潰。 我不知道這是否真的可以解決。 但是似乎在Visual Studio 2010中存在類似的問題:僅在使用openmp-x64的程序中崩潰
EDIT2:
我設法整理了一個最小的工作示例。 可以在這里下載代碼:
https://github.com/davidmarianovak/crashtest
您需要Boost(我使用1.60)和QT5(我使用5.6.3)。 在發行版中構建GoAcquire(/ GL在Visual Studio中處於活動狀態)。 之后,在Release中構建GoGUI(激活/ GL並使用“ standard”進行鏈接時代碼生成)。 構建它之后,運行它,它應該崩潰。
可以通過在“ GoInterface.hpp”第22行中進行更改來避免崩潰:
void fillGraphicsViews(std::vector<cSensorConstruct> vSens);
至
void fillGraphicsViews(std::vector<cSensorConstruct> &vSens);
但是我真的不相信這是問題所在。 誰能告訴我,我在做什么錯? 我為此使用Visual Studio 2015。
我敢打賭,您會忘記迭代器/引用無效。 因此,問題不在於顯示的代碼。
這是有道理的,因為您報告指針似乎起作用:即使push_back
導致重新分配,指針也保持不變。
當您不知道向量元素將保持有效時,只需不要堅持對向量元素的引用/重復。
如果向量具有已知的最大大小,則可以通過提前保留容量來“作弊”:
static constexpr size_t MAX_BUFFERS = 100;
std::vector<cTest> vC;
vC.reserver(MAX_BUFFERS); // never more
然后也許要保護不變式:
assert(vC.size() < MAX_BUFFERS);
vC.push_back(obj);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.