2016-10-04 32 views
-5

私はクラスを持っています。コンストラクタは問題なく実行されます。プログラムの終了後にデストラクタが実行しないのはなぜですか?私はどんな助けにも感謝します。デストラクタは実行されません

class foo{ 
    foo(){ 
    cout<<"This is constructor!"<<endl; 
    } 
    ~foo{ 
    cout<<"This is destructor! "<<endl; 
    } 
}; 

int main(){ 

foo* temp; 
temp = new foo(); 

/*some code*/ 

return 0; 
} 
+2

メモリリークが発生しているためです。 – juanchopanza

+0

[これらの書籍](http://stackoverflow.com/q/388242/2069064)のいくつかを見てみることをお勧めします。 – Barry

+0

終了する前に 'delete temp'を実行することによって、いつでも強制的にそれを強制することができます。 – infixed

答えて

0

、あなたは(あなたのプログラムでnew演算子を使用して)オブジェクトdynamically用のメモリを割り当てられているので、あなたがdelete演算子を使用して、それを解放しなければなりませんが。そうしないと、memory leaksが作成されます。つまり、あなたが割り振っているメモリを追跡し、もはやそれらを必要としないときに解放する必要があります。 memory leaks over hereについて読むことができます。

しかし、automaticオブジェクトの場合、destructorは、オブジェクトがスコープから外れると暗黙的に呼び出されます。たとえば、

int main() 
{ 
    foo temp; 
    // Do Something Interesting 

    return 0; 
} 

上記のプログラムの出力結果では、Destructorが呼び出されます。

また、プログラムには他にも問題があります。 1つはあなたのクラスのコンストラクタとデストラクタをfooの下にPublicの下に宣言していないということです。もう一つは、デストラクタ~fooと一対の括弧を忘れてしまったことです。プログラムをコンパイルしようとすると、コンパイラはエラーをスローします。正しいプログラムは以下の通りです:

#include <iostream> 
using namespace std; 

class foo { 
public: 
    foo() { 
     cout<<"This is constructor!"<<endl; 
    } 
    ~foo() { 
     cout<<"This is destructor! "<<endl; 
    } 
}; 

int main() { 

    foo* temp; 
    temp = new foo(); 

    /*some code*/ 

    delete temp;  
    return 0; 
} 
1

あなたのポインタを削除しないので、Therは解体するものではありません。 これを試してください。今すぐ解体する必要があります。

class foo{ 
    foo(){ 
    cout<<"This is constructor!"<<endl; 
    } 
    ~foo{ 
    cout<<"This is destructor! "<<endl; 
    } 
}; 

int main(){ 

foo* temp; 
temp = new foo(); 

/*some code*/ 

delete temp;  // Decinstruct when pointer is deleted 
return 0; 
} 
2

変数へのメモリは3通りの方法で割り当てることができます。それらは:

1)自動:ループが閉じて取得した後、自動ストレージ割り当ての変数が破壊されます。

2)スタティック:静的ストレージ割り当ての変数は、プログラムが開始される前にメモリを説明すると、プログラムの終了時に破棄されます。

3)動的:ダイナミックストレージ割り当てを持つ変数は、newコマンドを使用してメモリを割り当てられ、それらは同等のdeleteコマンドを使用することによってのみ削除できます。

あなたの問題は、私の上記の説明では第三ケースに関連しています。メモリはnewメソッドを使用して割り当てられますので、メモリを解放する位置にdeleteを使用してください。上記の最初のケースを使用して変数にメモリを割り当てた場合、変数はプログラムの最後に自動的に破棄されます。

希望すると、これが役立ちます。

関連する問題