new演算子がヒープ領域からメモリを割り当てるのに対し、delete演算子はメモリをヒープ領域に解放します。
通常のオブジェクトの場合
delete ポインタ; ポインタ = NULL;
newで配列を割り当てた場合
delete [] ポインタ; ポインタ = NULL;
と、delete演算子を使います。
通常のオブジェクトへのポインタと、オブジェクトの配列へのポインタで、deleteの際には、[]を使用して区別する必要があります。
deleteの動作を実験で確認してみます。
#include <iostream>
int main() {
// 整数の場合
int *one_ptr;
one_ptr = new int;
*one_ptr = 100;
std::cout << *one_ptr << "\n";
std::cout << one_ptr << "\n";
// 通常のオブジェクトへのポインタをdelete
delete one_ptr;
one_ptr = NULL;
// 確認
std::cout << one_ptr << "\n\n";
// 整数型の配列の場合
int *data_ptr;
data_ptr = new int[5];
std::cout << data_ptr << "\n";
delete [] data_ptr;
data_ptr = NULL;
std::cout << data_ptr << "\n";
return 0;
}
実行結果。
100 00426C28 00000000 00426CD0 00000000
ポインタをdeleteしたあとに、メモリが解放されて「00000000」となっているのを確認できます。
メモリを解放し忘れた場合は、バッファは使用されないが、メモリ管理システムからはまだ使用しているように見える状態となる。
これを、メモリリークと呼びます。
解放されたメモリを使用してしまうのも、プログラムがクラッシュする原因となる。
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/277