0

I got the the following code:

T *p = new T[10];
delete p;

It should be delete [] p, I think. I tried it on T=int type, no error. Then I created a simple class, exception. Any clear explanation?

T *p = 0;
delete p;

What's wrong with them? [I looked it up, it seems that although delete p will lead to error, but program resume because compiler thinks p==0 in the first place, so this error does not matter.]

4

2 に答える 2

5

はい、
電話する必要があります delete [] p;

明確な説明はありますか?

次の動作は未定義です。

  • delete割り当てが完了した場合に呼び出すnew []
  • delete動的に割り当てられていないポインタを呼び出します。

未定義の動作とは、何かが起こる可能性があることを意味し、クラッシュを強制するものではないことに注意してください。これは単に、プログラムが任意の動作 (期待どおりに動作することを含む) を示すことができることを意味します。

ポインターdeleteを呼び出すことは完全に有効です。NULL標準ではそれが許可されています。オペレーターは内部的にそのコアを取得します。呼び出し元はチェックdeleteを気にする必要はありません。NULL


参考文献:

C++03 標準 §3.7.4.2-3:

例外をスローして解放関数が終了した場合、動作は未定義です。割り当て解除関数に指定された最初の引数の値は、NULL ポインター値である可能性があります。その場合、および割り当て解除関数が標準ライブラリで提供されているものである場合、呼び出しは効果がありません。それ以外の場合、delete(void*)標準ライブラリで operator に提供される値は、いずれかの operator の前の呼び出しnew(std::size_t)またはoperator new(std::size_t, const std::nothrow_-t&)標準ライブラリで返された値の 1 つであり、標準ライブラリで operatordelete[](void*)に提供される値は、標準ライブラリ内のoperator new[](std::size_t)または のいずれかの以前の呼び出し。operator new[](std::size_t, const std::nothrow_t&)

于 2013-01-20T13:56:49.150 に答える
1

でオブジェクトの配列を割り当てた場合はnew[]、 で削除する必要がありますdelete[]。そうしないと、未定義の動作が発生します。

と の主な動作の違いはdeletedelete[]後者はメモリの割り当てを解除するだけでなく、配列内の各オブジェクトのデストラクタも呼び出すことです。

あなたの2番目のポイントを考慮してください:

T *p = 0;
delete p;

これはエラーを引き起こしませんがdelete、ポインターが null の場合に予想される動作であるため、何もしません。

于 2013-01-20T13:59:57.997 に答える