簡體   English   中英

在stl向量中提升boost圓形緩沖區會在版本崩潰

[英]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.

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