2016-09-28 3 views
0

C++のクラスにデストラクタ関数を追加しました。C++のデストラクタとdelete()メソッド

class object { ~object() }; 

し、それによってヒープ

object *pointer = new object; 

でそれを割り当て、新しいメソッドを持つオブジェクトを宣言し、私はまだプログラムの最後に

delete(object); 

メソッドを使用する必要がありますか? (デストラクタは既にこれを正確に担当していませんか?)

+0

はい、この場合、デストラクタを呼び出してメモリの割り当てを解除するには、依然として 'delete'を呼び出す必要があります。 –

+0

または 'std :: unique_ptr ポインタ(新しいオブジェクト());'そして、裸のポインタがリソースを所有するのを止める。 – WhozCraig

+0

そして、新しいものとして、括弧は必要ありません。 – Rene

答えて

0

デストラクタは、クリーンアッププロセスをカスタマイズする方法です(ログを追加する、3/5のルールに従ってクリーンアップを行うなど)。まだdeleteが必要です。そうしないと、メモリリークが発生します。

言われているので、それは時に、眉をひそめ、コードを書くことが悪い習慣と考えだとactially ニーズnew sおよびdelete S(特に後者)。ヒープにオブジェクトを格納する必要がある場合は、unique_ptr/shared_ptrまたはvectorのようなコンテナを使用します。

時間がある場合は、C++ Con 2016:Leak-Freedom in C++からHerb Sutterの話を聞くことをお勧めします。

0

デストラクターは、オブジェクトの存続期間が終了すると呼び出されます。ヒープに割り当てられたオブジェクトの場合、これは削除するときに意味します。 だから

delete(object); 

への呼び出しは、あなたのdescructorを呼び出して、割り当てられたメモリを解放します。

2

delete(object)に電話する必要があります。デストラクタはオブジェクトを削除する方法を担当し、オブジェクトを削除するのはdelete(object)です。しかし、現代のC++では、裸のポインタの使用は本当に悪い習慣と考えられています。メモリを管理するためにstd :: unique_ptrなどのスマートポインタを使用することを検討する必要があります。

0

はい、Deleteメソッドが必要です。メンバーobjects

Default destructorsコールデストラクタが、オブジェクトにNOT削除ポインタを行います。したがって、が明示的にdeleteを呼び出すデストラクタを記述する必要があります。同様に、

delete pointer; 
0

あなたは2種類のメモリを持っています。 スタックおよびヒープ

あなたはヒープ(あなたは、newなどをmalloc呼び出す)あなたが持っている上にある

すべて(コンストラクタを呼び出している削除の手順の1)の範囲の外に出たときに、スタック上のすべては自身を削除します明示的に自分自身で削除してください(その結果、デストラクタが呼び出されます)。

unique_ptr/shared_ptrのようなスマートポインタは、ヒープオブジェクトの手動削除を取り除き、オブジェクトがもはや必要でないときに削除されるようにするための最新のC++の方法です。

0

プログラムの最後にdelete(object);メソッドを使用する必要がありますか?

はい。

デストラクタはすでにこれに責任がありますか?

あなたdelete ptr;そのデストラクタを呼び出すものです。デストラクタを宣言していなければ、宣言されているはずなので、違いはありません。

オブジェクトに自動保存期間がある場合は(newで作成していないときは非常にゆるやかに)オブジェクトを書き込む必要はありません。これは同等の処理が行われるためです。

どちらの場合でも、デストラクタが呼び出されます。

0

新しいとdelete式(新しいものではないと演算子を削除)2つのコールを呼び出している:

新しい:

1) call the operator new for memory allocation 
2) invoke the appropriate constructor 

削除:

あなたが持っているしたがって
1) invoke the destructor 
2) call the operator delete for memory deallocation 

をリソース(メモリ)リークを避けるために、新しいものと削除を組み合わせること。 しかし、オブジェクトの構築と削除には新規作成と削除は必要ありません。