3

大きなコードの途中にこの小さなコードがあります。

int *p = new int[100];
p += 50;
delete []p;

コンパイラは 51番目の場所からメモリのみを削除しますか? そうだと思います。ただし、配列ポインターの場合、コンパイラーは、割り当てられたオブジェクトの数を示す追加の項目を保持します。では、その場合、割り当てられたサイズを超えてメモリを削除するべきではありませんか? または、51 ~ 100番目の要素を削除し、1 50番目の要素をメモリに保持しますか。この場合、メモリ リークが発生する可能性があります。

4

3 に答える 3

6

実際には未定義の動作です。あなたができるのはdelete/delete[]から得たものだけnewですnew[].

于 2012-08-26T12:10:06.937 に答える
5

未定義の動作です。C++ 標準は次のように述べています

3.7.4.2 解放関数

3 ... それ以外の場合、標準ライブラリで に提供された値が、または標準ライブラリoperator delete(void*)のいずれかの前の呼び出しによって返された値のいずれでもない場合、動作は未定義です。標準ライブラリは、または標準ライブラリ内のいずれかの前の呼び出しによって返された値の 1 つではありません。operator new(std::size_t)operator new(std::size_t, const std::nothrow_t&)operator delete[](void*)operator new[](std::size_t)operator new[](std::size_t, const std::nothrow_t&)

4 ... 無効なポインター値を使用した場合の影響 (割り当て解除関数への受け渡しを含む) は定義されていません。(一部の実装では、システム生成のランタイム エラーが発生します。)

于 2012-08-26T12:14:39.867 に答える
1

コンパイラはメモリを割り当てたり削除したりしません。new から取得していないポインタ値で free を呼び出した場合に何が起こるかは、OS に依存します。保証されている唯一のことは、それが間違っているということです。

于 2012-08-26T12:12:01.100 に答える