C ++プロジェクトでパートナーと協力しているので、スタックで初期化されたオブジェクトを明示的に削除することは可能ですか?(したがって、ポインターなし)
例えば:
MinHeap h(data); // on stack
対
MinHeap *h = new MinHeap();
私は常に大きなオブジェクトのヒープにメモリを割り当てていたので、これはこれまでに発生したことはありません。
スタック変数は、現在のスコープで常に有効です。インスタンスを有効にしたいブロックを中かっこで囲むことにより、スコープを強制する (したがって、割り当てられたメモリを解放する) ことができます。
{
MinHeap h(data);
// Do stuff here
} // h gets freed here
短くて唯一の答えはノーです。
オブジェクトがスタックに割り当てられている場合、実際にそれを割り当てるのはユーザーではなく、コンパイラーが割り当てます。関数のスコープが終了したときにオブジェクトを「割り当て解除」(または「削除」)するのも、コンパイラの責任です。
使用する唯一の理由delete
は、 で割り当てたものを解放することですnew
。
スタック上で初期化されたオブジェクトを明示的に削除することはできますか?
いいえ、できません。
式に関する C++11 標準のパラグラフ 5.3.5/2 によるとdelete
:
オペランドがクラス型の場合、オペランドは前述の変換関数を呼び出すことによってポインタ型に変換され、変換されたオペランドは、このセクションの残りの部分で元のオペランドの代わりに使用されます。最初の選択肢 (delete オブジェクト) では、delete のオペランドの値は、null ポインター値、前の new 式によって作成された非配列オブジェクトへのポインター、またはオブジェクトを表すサブオブジェクト (1.8) へのポインターである可能性があります。そのようなオブジェクトの基底クラス (第 10 節)。そうでない場合、動作は undefinedです。[...]
また、自動保存期間を持つ変数 (つまり、「スタック上」に割り当てられる) に関する段落 3.7.3/3 も関連します。
自動保存期間を持つ変数に初期化または副作用のあるデストラクタがある場合、ブロックの終了前に破棄してはならず、未使用のように見えても最適化として削除してはなりません。ただし、クラス オブジェクトまたはそのコピー/移動は、12.8 で指定されているように削除できます。