2011-12-17 22 views
-1

をスキップこれが私の最後の質問のフォローです: C++ full system crash, release mode onlyC++リリース、メモリの割り当ては、コンストラクタ

基本的に私がリリースモードで、完全にOSを凍結され、ツリー状のデータ構造を有しています。これは、メモリ割り当てが突然急増したために発生します。これは、OSが処理できるものを超えています。

NULLにポインタを初期化し、必要に応じて(必要に応じて)見つけたら必要なコードをすべて確保しているので、このようなメモリリーク(これは分かりますが、それは分かります)は非常に奇妙です。 NULLにする。デバッグモードでは、この正しい動作が確認され、物事はうまく割り当てられています(私はNULLポインタが0にデバッガから設定されていることがわかります)。

しかし、リリースモードでは、状況が異なります。コンストラクタは完全にスキップされ、すべてのクラスの内部はランダムなガベージに初期化されます。これにより、ポインターにはひそかにも行き渡るようになり、システム全体がクラッシュするまでメモリーが割り振られます。

リリースモードでコンストラクタが無視されるのはなぜですか?

私はWindows 7でVisual Studio 2010を使用しています。

+6

コードを投稿してください。 –

+0

あなたは本当にあなたのコンストラクタがリリースモードで無視されているという問題があると思いますか? –

+0

はい、私はそれをデバッグしました。投稿するにはあまりにも多くのコードがありますが、それは多かれ少なかれこれに基づいています:http://www.cmlab.csie.ntu.edu.tw/~wildmb/pbrt/octree_8h-source.html – Gigi

答えて

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&); 

しかし、私はこの中で問題を引き起こしされない理由を正当な理由を与えることはできませんあなたのデバッグも同様にビルドされているので、私はこれが実際にあなたのトラブルの根源になると懐疑的です。 (不完全)コードから判断

+0

最後に答えは聞こえそうです。ありがとう、私はそれがものを修正するかどうかを確認します。 – Gigi

+0

編集への応答:それは本当ですが、私が正しく理解していれば、コンストラクターがスキップされている理由を説明しています(コメント者の中には、解決策ではない場合、間違いなくスタートです。 – Gigi

+0

コンストラクタが「スキップされた」理由がわかりません。何が起きるかは、コンパイラが自動的にターゲットオブジェクトへのポインタをコピーするctorまたはassignment opを作成することです。今度は、同じポインタを持つ2つのオブジェクトが2回削除され、ヒープがねじれます。私はそれもデバッグモードで爆破することを期待したいと思います。より多くの実際のコードを投稿することができます(もちろん、ある点まで)。 –

5

:別のものにOctNodeを割り当てる場合

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; 
}; 

それはメモリリークが発生してもよいです。コンパイラは、デフォルトのコピーコンストラクタと代入演算子を生成します。後者は、以前に割り当てられたメモリの割り当てを解除しないため、メモリリークを引き起こす可能性があります。クラス定義を次のように変更することをお勧めします。

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&)がプライベートなのでコンパイルされないと、リークの原因となっていました。

+0

マイケル・バーの答えと同じように、これはうまくいくかもしれません。 – Gigi

+0

あまりにも悪い私はそれを43秒後投稿した) –