デストラクタが呼び出されるオブジェクトを削除した場合、デストラクタが関数内に何かをやった後にメモリが解放されますか?C++デストラクタ:メモリが解放されたら?
答えて
最小派生クラスのサブオブジェクトが破棄された後にのみ、メモリは解放されます。だから、持っている場合:
class Base {
};
class Derived : public Base {
public:
~Derived();
};
最初Derived
が破壊され、その後、Base
が破壊されるだけにしてメモリが割り当て解除されます。
デストラクタの終了後にメモリが解放されます。そうしないと、デストラクタ内のメンバ変数にアクセスするとsegfaultが発生します。
delete演算子は、私はデストラクタ関数自体が実行を終了した後、メモリが解放されると思うだろうデストラクタの後に呼ばれるが、メモリが解放されるときに使用されるアロケータ
までです。私は、例外がキャッチされたときに、オブジェクトへのデストラクタは、オブジェクト自体が有効範囲外になるまで呼び出されないことを知っています。
実際にはdelete
を分解してください。メモリが削除されているのは比較的明らかです。したがって、このような文:
delete some_ptr;
は、この擬似コードとほぼ同じです:
some_ptr->~some_ptr();
free(some_ptr);
だから、メモリはデストラクタを呼び出した後に解放されます。デストラクタの動作は、演算子delete
ではなく、クラスの定義によって決まります。通常、ローカルクリーンアップを行い、その基本クラスのデストラクタも呼び出されるようにします。
メモリを解放することは、実際にはデストラクタの一部ではないことに気づくことが重要です。メモリを解放するのはdelete
演算子です。擬似コードでfree
機能が削除クラス、またはグローバルのいずれかのため、実際operator delete()
機能の一つであること
注意。それは実際に記憶を解放します。
これは 'free()'ではなく、 'operator delete()'です。 – sharptooth
@sharptooth、あなたは明確にすることができますか?私はそれが「擬似コード」であると言いました。 –
擬似コードであっても、C++は '演算子delete()'(グローバルまたはクラス固有)を使用して、 'delete'ステートメントでメモリを解放します。 – sharptooth
C++では、オブジェクト内で利用可能なデータを使用していくつかのコードを実行することが破棄されます。このコードは任意です。
メモリを解放することは、通常、delete
オペレータによって隠された低レベルの処理であり、デストラクタへの呼び出しの前に呼び出されるべきではありません。
これは最高のAllocatorインターフェースによって要約される。
allocate
とdeallocate
はconstruct
とdestroy
生のメモリを操作するために使用されているが
construct
,destroy
およびdeallocate
は、 n以前にそのアロケータによって割り当てられたメモリ。また、destroy
はメモリの割り当てを解除せず、その後のdeallocate
への呼び出しが必要であることを保証します。
これは、オブジェクトを破棄して解放された領域を再利用して別の場所を構築できる低レベルのインタフェースです。
- 1. C++デストラクタがメモリを解放する
- 2. メモリ解放C++
- 3. デフォルトのデストラクタはメンバポインタが指すメモリを解放しますか?
- 4. MySQLが解放されないメモリ
- 5. メモリが解放されない
- 6. C#pictureboxメモリ解放問題
- 7. 解放されたメモリがページフォールトを引き起こさない
- 8. ループされたオブジェクトからメモリを解放する方法
- 9. フラグメントがメモリから解放されていません
- 10. アクティブ時にUISearchControllerがメモリから解放されません
- 11. C-Style-Arrayからメモリを解放してください。
- 12. UINavigationViewControllerメモリ解放
- 13. Three.js - 解放メモリ
- 14. カカオ64ビットバイナリリークメモリ? (NSDataを解放するとメモリが解放されません)
- 15. ダイナミック構造を解放するとメモリが解放されない
- 16. 完了前にObj-C自動解放ネットワークリクエストが解放されました
- 17. フラグメントが削除された後にメモリが解放されない
- 18. ARCと解放メモリ
- 19. CでReallocに割り当てられたメモリを解放できません
- 20. C++では、構造体へのポインタのメモリを解放するためのデストラクタを書く方法は?
- 21. このタイマーはメモリから解放されますか?
- 22. ランタイムコンポーネントで作成されたC++ WinRTクラスのメモリを解放する方法
- 23. コピーコンストラクタ:ストレージが解放されたら?コードが与えられ
- 24. newCStringで割り当てられたメモリを解放する
- 25. 最近解放されたメモリの割り当て
- 26. WPF MVVMアプリケーションでバインドされたコレクションのメモリを解放する
- 27. NewDirectByteBufferでラップされたメモリを解放する
- 28. 保持されたオブジェクトのメモリを解放する方法
- 29. Objective-c:メソッドから自動解放されたオブジェクトを返す
- 30. メモリからのjni参照の解放
実際にこのようなことはありますか?特定のデストラクタが呼び出され、クラスがそのように宣言した場合は仮想的になります。そのデストラクタはすべてのサブオブジェクトを破壊する責任があり、メモリは解放されます。基底クラスのないすべてのサブオブジェクトは、最小限の派生であり、特に責任や意義はありません。 – Potatoswatter
@Potatoswatter:注釈を解除する関数の呼び出し担当者を正確に指定していません。すべての詳細で2ページ分の回答が必要となるからです。 – sharptooth
@Potatoswatter:私は私が従うかどうかわかりません。サブオブジェクトを破壊する責任は、デストラクタではありません。デストラクタは、そのオブジェクトに保持されているリソースを解放する責任がありますが、他のオブジェクトのデストラクタを呼び出す必要はありません。 'class test {string a; 〜test(){}}; '〜test'デストラクタはこの例では完全に定義されています。クラスによって直接管理されるリソースはなく、何もしません。 '〜test'ではなく、'〜test'が実行を完了した後、 'a'サブオブジェクトで'〜string'を呼び出します。同じことが継承に伴い、ベースのデストラクタが自動的に呼び出されます。 –