2016-05-13 16 views
-2

なぜ私はこのようなコードを書いた場合(Xがジェネリッククラスである)コンストラクタとデストラクタダブル無料()や破損:C++

int main() 
     { 
     X one(); 
     one.~X(); 
     return 0; 
     } 

を呼び出すことは私に、このエラーを与えますか?

Double free() or corruption:C++ 
+0

デストラクタを手動で呼び出す必要はありません。ローカルオブジェクトはスコープの終わりに自動的に削除されます: '{Y background(3000,5000); }}はオブジェクトを '}'で削除します。 – kfsone

+0

_ @ Tarlo_x_生ポインタで邪魔をしないでください。代わりに標準のコンテナを使用してください。 –

+2

インストラクターが自動ピストルでロシアンルーレットをプレイする必要がある場合は、私はステークスを追加する必要がありますが少しポインタが低いです。 – user4581301

答えて

4

あなたは(ヒープに割り当てられている場合、またはdelete d)のオブジェクトがスコープ外になったとき、彼らは暗黙的に呼び出され、明示的にデストラクタを呼び出すことはほとんどないはずです。まず、の配列をbackground.~Y()を呼び出して手作業で割り当てを解除し、次にこの配列は次の}にもう一度割り付けを解除しようとします。

1

オブジェクトのデストラクタを呼び出すことはほとんど常に間違っています。実際、私はこれが正しい状況に遭遇したことはありません。デストラクタがすでに呼び出されていること、

#include <iostream> 

struct Foo{ 
    Foo() { std::cout << " constructor " << std::endl; } 
    ~Foo() { std::cout << " destructor " << std::endl; } 
}; 

int main(){ 
    Foo foo; 
    // foo.~Foo(); // <- never ever do this ! 
}     // <- object is destroyed here ! 

実行これを、あなたが表示されます。あなたがエラーを取得する理由を理解するのに役立ちますRAIIと、おそらくこの例について読む必要があります。既に破壊されたオブジェクトを破壊すると、あなたが得るエラーにつながります。

関連する問題