2017-08-04 118 views
0

我們有一個類,我們聲明boost::lockfree::queuestatic數據成員並覆蓋newdelete運算符。運算符new/delete中的邏輯是創建一個類的實例,以將對象的指針放入隊列中。boost :: lockfree :: queue作爲靜態數據成員

問題是,在測試用例完成後,我會得到段錯誤。如果我發表評論delete arr[i]聲明那裏故障不再發生。

我的假設是,導致Boost隊列是靜態的,因此數據成員最後會被銷燬,或者當程序結束時會調用它自己的析構函數,但是我不確定它的析構函數中是什麼導致中止或給出分段錯誤。

任何指針將有助於解決問題嗎?

回答

2

您需要注意的是operator newnew expression(例如new B())是不同的東西。 新的表達式調用相應的operator new,然後調用該對象的構造函數。 operator new的工作是返回未初始化的內存,該對象在該點不存在。

當您在operator new實現中調用f->initialize();時,該調用之後是對象的構造函數,該對象必須初始化所有對象的內存。

換句話說,你只能實現內存緩存operator new,不對象緩存

如果你想要一個緩存對象,你需要使用一個工廠(工廠設計模式)。

看一看boost::pool即可開始使用。