0

終了時にプログラムがクラッシュします。エラーをさかのぼると、クラス gWSW のデストラクタにたどり着きました。問題は次のとおりです。

クラス gShop: public gTexture があります。このクラスでは、クラス gWSW のオブジェクトへのポインターを宣言して初期化します。

gWSW には、クラス gTexture で宣言および初期化されたオブジェクトへのポインターが再びあります。

ポインタに対して delete を呼び出すことで、すべてのクラスに適切なデストラクタを与えました。

ESCを押してすべてのデスクタクタが呼び出されるまで、プログラムは正常に実行されます。ここで gWSW のデストラクタでクラッシュします。それは私がそのようなものを持っているということです:

class gShop : public gTexture
   {
   public:
       gShop(): pWSW(new gWSW()) {}
      ~gShop(){delete pWSW;}   

   gWSW*    pWSW;
   };

class gWSW 
   {
   public:
       gWSW():gWSW: pTextuer(new gTexture()) {}
      ~gWSW(){delete pTexture;}   

   gTexture*    pTexture;
   };

class gTexture 
   {
   public:
       gTexture() {}
      ~gTexture();

//... a pointer to char[] here but will be also deleted in its destructor
   };

クラッシュする前の最後の呼び出しは ~gWSW() にあります。「delete pTexture」をコメントアウトすると、プログラムはエラーやクラッシュなしで正常に終了します。続行してコメントを残す前に、問題が何であるかを理解したい.

4

1 に答える 1

0

ああ、私は答えを見つけたと思います。「スタック」を訪れてからしばらく経ちました。独自のコピー コンストラクターを作成して、すべてのオブジェクトのディープ コピーを提供する必要があります。

このようにして、メモリがヒープから新しいポインタに割り当てられます。新しいメモリ位置の値には、元のオブジェクトの値が割り当てられます。

常にコピー コンストラクターを非公開にしてエラーを見つけるようにアドバイスしてくれた Hans Passant に感謝します。

于 2013-10-12T02:54:45.187 に答える