1

たとえば、クラス オブジェクトの「新しい」インスタンスを作成してからそのインスタンスを「削除」すると、そのインスタンスで使用されているすべてのメモリが (解放されるように) クリアされますか? インスタンスが他のオブジェクトの「新しい」インスタンスを作成した場合はどうなりますか? 彼らも影響を受けますか?

「削除」はどのように機能しますか? 削除方法に関する安全なルール/ヒントはありますか? 実際に特定のものを保持し、そのインスタンス内の他のすべてを削除したい場合はどうすればよいですか?

編集:「スマート ポインター」に関して、特定の瞬間に削除する必要がある場合、まだ削除できますか? もしそうなら、それと「新しい」の違いは何ですか?(アプリケーションが予期せず終了したときにスマート ポインターが削除されない限り?)

4

7 に答える 7

1

smart_pointers生のポインターの代わりに使用します。

「削除」はどのように機能しますか?

オブジェクトのデストラクタを呼び出し::operator deleteてから、メモリを解放する関数を呼び出します。

最初の 2 つの質問:

キーワード delete はオブジェクトのデストラクタを呼び出すため、デストラクタで手動でメモリを解放する必要があります (リソースを使用する場合は、解放する必要があります)。簡単な例

class A {};

class B
{
public:
    A() : a(new A()) {}
   ~A() { delete a; /* free a's memory */ }
private:
    A* a;
};
于 2013-04-11T13:27:24.533 に答える
1

ルール 1.new正当な理由がない限り使用しないでください。

ルール 2. を使用する場合は、どこかnewに対応する呼び出しが必要です。delete

何をするかdeleteについて:オブジェクトのデストラクタを呼び出し(存在する場合)、メモリを解放します。「クリア」が「使用されたメモリをゼロまたはその他の値に設定する」ことを意味する場合、通常はいいえ。しかし、「他の用途に使用できるようにする」という意味であれば、そのとおりdeleteです。

于 2013-04-11T13:28:42.853 に答える
0

いいえ、deleteメモリやオブジェクトを「クリア」しません。オブジェクトによって割り当てられたリソースを解放する必要あるオブジェクトのデストラクタを呼び出します。

于 2013-04-11T13:27:37.120 に答える
0

残念ながら、スマート ポインター トリックなどを使用しない限り、これを達成するための安全な方法はありません。'new' と 'delete' は自由に使用できるため、メモリ管理は自分で行う必要があります。

于 2013-04-25T15:39:02.070 に答える
0

を使用してオブジェクトを作成する場合new、メモリはすべてのメンバーに割り当てられ、1 つのコンストラクターが呼び出されます (指定したものに応じて)。それを使用して、そこで参照を作成できます。たとえば、次のようになります。

public Foo()
{
    m_bar = new Bar();  // Bar* m_bar;
}

ただし、これはオブジェクトのサイズには影響しません。ポインター ( m_bar)は常にm_bar4 バイト (32 ビット アーキテクチャーの場合) のメモリを必要とするため、オブジェクトのサイズは約 8 バイトです (コンストラクターへのポインターの場合は少なくとも 4バイト、ポインターの場合は 4 バイト) 1

正反対はデストラクタで、使用時に呼び出されdeleteます。これを使用して、すべての参照を解放できます。

public ~Foo()
{
    if (m_bar)  // If the pointer is not NULL, thus pointing anywhere.
        delete m_bar;  // Calls destructor of "Bar" and free it's memory.
}

したがってdelete、 を呼び出すと、デストラクタが呼び出され、オブジェクトが占有するメモリが解放されますが、(ここのように) オブジェクトが参照するメモリが自動的にm_bar使用されるわけではありません。これらのオブジェクトがデストラクタ内で削除されることに注意する必要があります。delete for を呼び出すのを忘れると、メモリ リークm_barと呼ばれるもので終わる可能性があります。

newandの使用deleteは、可能な限り多くのパフォーマンスが必要なシナリオ (リアルタイム シナリオなど) で有効ですが、通常はスマート ポインターを使用することをお勧めします。

1オブジェクトの実際のサイズについて実際に説明することはできないことに注意してください。コンパイラがそれをどのように変換するかによって異なります。

于 2013-04-11T13:28:26.980 に答える
0

削除方法に関する安全なルール/ヒントはありますか?

はい、有名な RAII (リソース割り当ては初期化) が解決策です。クラスが割り当てたすべてのメモリをコンストラクターで解放する必要があることを宣言します。C++ は、例外がスローされた場合でも、デストラクタが呼び出され、デストラクタが割り当て解除の安全な場所であることを保証します。

インスタンスが他のオブジェクトの「新しい」インスタンスを作成した場合はどうなりますか?

それらも追跡する必要があります。それらをクラスのメンバーとして保持し、デストラクタで削除するか、追跡するために複雑な手順が必要になる場合があります。

于 2013-04-11T13:30:54.177 に答える