2011-01-25 16 views

答えて

7

最小派生クラスのサブオブジェクトが破棄された後にのみ、メモリは解放されます。だから、持っている場合:

class Base { 
}; 

class Derived : public Base { 
public: 
    ~Derived(); 
}; 

最初Derivedが破壊され、その後、Baseが破壊されるだけにしてメモリが割り当て解除されます。

+0

実際にこのようなことはありますか?特定のデストラクタが呼び出され、クラスがそのように宣言した場合は仮想的になります。そのデストラクタはすべてのサブオブジェクトを破壊する責任があり、メモリは解放されます。基底クラスのないすべてのサブオブジェクトは、最小限の派生であり、特に責任や意義はありません。 – Potatoswatter

+0

@Potatoswatter:注釈を解除する関数の呼び出し担当者を正確に指定していません。すべての詳細で2ページ分の回答が必要となるからです。 – sharptooth

+0

@Potatoswatter:私は私が従うかどうかわかりません。サブオブジェクトを破壊する責任は、デストラクタではありません。デストラクタは、そのオブジェクトに保持されているリソースを解放する責任がありますが、他のオブジェクトのデストラクタを呼び出す必要はありません。 'class test {string a; 〜test(){}}; '〜test'デストラクタはこの例では完全に定義されています。クラスによって直接管理されるリソースはなく、何もしません。 '〜test'ではなく、'〜test'が実行を完了した後、 'a'サブオブジェクトで'〜string'を呼び出します。同じことが継承に伴い、ベースのデストラクタが自動的に呼び出されます。 –

2

デストラクタの終了後にメモリが解放されます。そうしないと、デストラクタ内のメンバ変数にアクセスするとsegfaultが発生します。

2

delete演算子は、私はデストラクタ関数自体が実行を終了した後、メモリが解放されると思うだろうデストラクタの後に呼ばれるが、メモリが解放されるときに使用されるアロケータ

0

までです。私は、例外がキャッチされたときに、オブジェクトへのデストラクタは、オブジェクト自体が有効範囲外になるまで呼び出されないことを知っています。

3

実際にはdeleteを分解してください。メモリが削除されているのは比較的明らかです。したがって、このような文:

delete some_ptr; 

は、この擬似コードとほぼ同じです:

some_ptr->~some_ptr(); 
free(some_ptr); 

だから、メモリはデストラクタを呼び出した後に解放されます。デストラクタの動作は、演算子deleteではなく、クラスの定義によって決まります。通常、ローカルクリーンアップを行い、その基本クラスのデストラクタも呼び出されるようにします。

メモリを解放することは、実際にはデストラクタの一部ではないことに気づくことが重要です。メモリを解放するのはdelete演算子です。擬似コードでfree機能が削除クラス、またはグローバルのいずれかのため、実際operator delete()機能の一つであること


注意。それは実際に記憶を解放します。

+0

これは 'free()'ではなく、 'operator delete()'です。 – sharptooth

+0

@sharptooth、あなたは明確にすることができますか?私はそれが「擬似コード」であると言いました。 –

+1

擬似コードであっても、C++は '演算子delete()'(グローバルまたはクラス固有)を使用して、 'delete'ステートメントでメモリを解放します。 – sharptooth

0

C++では、オブジェクト内で利用可能なデータを使用していくつかのコードを実行することが破棄されます。このコードは任意です。

メモリを解放することは、通常、deleteオペレータによって隠された低レベルの処理であり、デストラクタへの呼び出しの前に呼び出されるべきではありません。

これは最高のAllocatorインターフェースによって要約される。

  • allocatedeallocate
  • constructdestroy生のメモリを操作するために使用されているが
オブジェクトのコンストラクタとデストラクタを呼び出すために使用されています

construct,destroyおよびdeallocateは、 n以前にそのアロケータによって割り当てられたメモリ。また、destroyはメモリの割り当てを解除せず、その後のdeallocateへの呼び出しが必要であることを保証します。

これは、オブジェクトを破棄して解放された領域を再利用して別の場所を構築できる低レベルのインタフェースです。

関連する問題