2011-12-17 52 views
-1

這是我的最後一個問題的後續: C++ full system crash, release mode onlyC++版本VS調試,內存分配,跳過構造

基本上我有一個樹狀的數據結構,在釋放模式,完全凍結OS。出現這種情況是由於內存分配突然激增,超出了操作系統可以處理的範圍。

這個看似內存泄漏(它是,但在一分鐘內更多)是非常奇怪的,因爲我有所有必要的代碼來初始化指向NULL的指針,並最終分配它們(如果需要),如果它們被發現爲NULL。在調試模式下,這個正確的行爲被確認,並且事情分配正常(我可以看到NULL指針從調試器設置爲零)。

但是在發佈模式中,情況有所不同。構造函數完全被跳過,並且所有類的內部都被初始化爲隨機垃圾。這導致指針也變得不合時宜,並且這是內存分配到整個系統崩潰的地方。

爲什麼釋放模式會忽略我的構造函數?

我在Windows 7 btw上使用Visual Studio 2010。

+6

發佈您的代碼。 – 2011-12-17 01:15:10

+0

你真的認爲問題在於你的構造函數在發佈模式中被忽略了嗎? – 2011-12-17 01:16:47

+0

是的,我調試它,這正是發生了什麼。有太多的代碼要發佈,但它或多或少基於此:http://www.cmlab.csie.ntu.edu.tw/~wildmb/pbrt/octree_8h-source.html – Gigi 2011-12-17 01:18:27

回答

3

您指向的示例代碼(http://www.cmlab.csie.ntu.edu.tw/~wildmb/pbrt/octree_8h-source.html)具有struct OctNode類管理原始指針,但沒有適當的複製構造函數或賦值運算符(或禁用它們)。

class Octree包含struct OctNode的一個實例,因此如果您有Octree對象被複制/分配,那麼堆很可能會損壞。

以下添加到struct OctNode禁止複製和分配,看你開始得到鏈接錯誤:

private: 
    OctNode(const OctNode&); 
    OctNode& operator=(const OctNode&); 

但是,我不能給出一個很好的理由,爲什麼這不會導致問題在你的調試版本也是如此,所以我很懷疑這實際上是你的煩惱的根源。

5

從(不完全)編碼判斷:

template <class NodeData> struct OctNode { 
     OctNode() { 
       for (int i = 0; i < 8; ++i) 
         children[i] = NULL; 
     } 
     ~OctNode() { 
       for (int i = 0; i < 8; ++i) 
         delete children[i]; 
     } 
     OctNode *children[8]; 
     vector<NodeData> data; 
}; 

可能分配OctNode到另一個時泄漏內存。編譯器生成默認的拷貝構造函數和賦值運算符。後者可能導致內存泄漏,因爲它不會釋放先前分配的內存。我建議將類定義更改爲以下內容:

template <class NodeData> struct OctNode { 
     OctNode() : children() {} // zero-initialize children 
     ~OctNode() { 
       for (int i = 0; i < 8; ++i) 
         delete children[i]; 
     } 
     OctNode *children[8]; 
     vector<NodeData> data; 
    private: 
     OctNode(OctNode const&); 
     OctNode& operator=(OctNode const&); 
}; 

並編譯您的代碼。如果它不能編譯,因爲OctNode& operator=(OctNode const&)是私人的,那麼這是導致泄漏。