7

newとはどう違いnew[1]ますか?deleteと一緒に使えますnew[1]か?

編集

そうですね、背景を提供するべきでした。申し訳ありません。私は VS 2010 で動作している BoundsChecker を評価していましたが、new[1] で delete[] を使用すると、メモリ リークが発生すると言われました。したがって、理論的には、new と delete のペアをどのように使用するべきかはわかっていますが、この特定の状況では、ボンネットの下にあるものについて混乱してしまいました。何が起こっているのですか?

4

4 に答える 4

12

Ed と Aix は正しいですが、内部ではさらに多くのことが行われています。

new を使用してから delete を使用すると、delete 呼び出しは 1 つのデストラクタを実行します。

new[] を使用する場合は、delete[] を使用する必要がありますが、delete[] は、呼び出すデストラクタの数をどのように知ることができますか? 2 つのインスタンスの配列、または 2000 のインスタンスの 1 つがある可能性がありますか? 一部の (おそらくほとんどまたはすべての) コンパイラが行うことは、返されるメモリの直前にインスタンスの数を格納することです。

したがって、new[5] を呼び出すと、new は次のようにメモリを割り当てます。

+---+-----------+-----------+-----------+-----------+-----------+
| 5 | instance1 | instance2 | instance3 | instance4 | instance5 |
+---+-----------+-----------+-----------+-----------+-----------+

そして、instance1 へのポインタを取得します。

後で delete[] を呼び出すと、delete[] はその数 (この場合は 5) を使用して、メモリを解放する前に呼び出す必要のあるデストラクタの数を確認します。

new と delete[]、または new[] と delete を混在させると、番号が欠落しているか、番号が正しくない可能性があるため、ひどく間違った方向に進む可能性があることに注意してください。

new[1] と delete を組み合わせるとうまくいく場合は、運がいいかもしれませんが、それに頼らないでください。

于 2011-09-22T06:52:18.583 に答える
11

newインスタンスを作成しますnew[1]が、単一要素の配列を作成します。配列のサイズを格納する場合new[1]と比較して、ほぼ確実に (小さな) メモリ オーバーヘッドが発生します。newでデフォルト以外のコンストラクターを使用することはできませんnew[]

newとともに使用する必要がありますdelete

new[]とともに使用する必要がありますdelete[]

于 2011-09-22T06:46:45.097 に答える
2

new[] は、オブジェクトの配列を割り当てて初期化し、最初の要素へのポインターを返す演算子です。これは、同じ動作をするが、配列ではなく 1 つの割り当てに対する new 演算子とは異なります。割り当て解除とオブジェクトの破棄には、new を delete と一緒に使用し、new[] を delete[] と一緒に使用する必要があります。

// operator new[] and new example

// create array of 5 integers
int * p1 = new int[5];
delete[] p1;

// regular allocation of one int
int * p1 = new int;
delete p1;

(詳しくはこちら

于 2011-09-22T07:00:24.007 に答える
0

'new[1]' は、1 つの項目の配列を作成します。delete[]メモリを解放するために使用する必要があります。newオブジェクトを作成するだけです。それと一緒に使用deleteしてください。

于 2011-09-22T06:45:43.163 に答える