deleteとdelete[]の違いについて
2036 ワード
C++のdeleteとdelete[]の違いはよく知られていませんが、今日出会ったので、インターネットで調べてみたら、結論が出ました.紛失しないようにバックアップをします.
C++は,newで割り当てられた個々のオブジェクトのメモリ領域を回収する際にdelete,new[]で割り当てられたオブジェクトのセットのメモリ領域を回収する際にdelete[]を用いることを示す.new[]とdelete[]については、(1)基本データ型の割り当てと回収空間;(2)カスタムタイプにスペースを割り当て、回収します.
次の手順を見てください.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
皆さんは自分でこのプログラムを実行して、delete p 1とdelete[]p 1の異なる結果を見て、私はここで実行結果を貼りません.
実行結果からdelete p 1は空間を回収する過程でp 1[0]というオブジェクトだけが構造関数を呼び出し,p 1[1]、p 1[2]などの他のオブジェクトは自身の構造関数を呼び出していないことが問題であることが分かる.delete[]を使用すると、スペースを回収する前にすべてのオブジェクトが最初に独自の構造関数を呼び出します.基本タイプのオブジェクトには構造関数がないので、基本タイプからなる配列空間を回収するにはdeleteとdelete[]を使用することができるはずです.ただし、クラスオブジェクト配列ではdelete[]しか使用できません.newの単一オブジェクトの場合、delete[]でスペースを回収することはできません.簡単な使用の原則は、newとdelete、new[]とdelete[]が対応して使用されることです.
C++は,newで割り当てられた個々のオブジェクトのメモリ領域を回収する際にdelete,new[]で割り当てられたオブジェクトのセットのメモリ領域を回収する際にdelete[]を用いることを示す.new[]とdelete[]については、(1)基本データ型の割り当てと回収空間;(2)カスタムタイプにスペースを割り当て、回収します.
次の手順を見てください.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>;
using
namespace
std;
class
T {
public
:
T() { cout <<
"constructor"
<< endl; }
~T() { cout <<
"destructor"
<< endl; }
};
int
main()
{
const
int
NUM = 3;
T* p1 =
new
T[NUM];
cout << hex << p1 << endl;
// delete[] p1;
delete
p1;
T* p2 =
new
T[NUM];
cout << p2 << endl;
delete
[] p2;
}
皆さんは自分でこのプログラムを実行して、delete p 1とdelete[]p 1の異なる結果を見て、私はここで実行結果を貼りません.
実行結果からdelete p 1は空間を回収する過程でp 1[0]というオブジェクトだけが構造関数を呼び出し,p 1[1]、p 1[2]などの他のオブジェクトは自身の構造関数を呼び出していないことが問題であることが分かる.delete[]を使用すると、スペースを回収する前にすべてのオブジェクトが最初に独自の構造関数を呼び出します.基本タイプのオブジェクトには構造関数がないので、基本タイプからなる配列空間を回収するにはdeleteとdelete[]を使用することができるはずです.ただし、クラスオブジェクト配列ではdelete[]しか使用できません.newの単一オブジェクトの場合、delete[]でスペースを回収することはできません.簡単な使用の原則は、newとdelete、new[]とdelete[]が対応して使用されることです.