delete演算子

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

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」となっているのを確認できます。

メモリを解放し忘れた場合は、バッファは使用されないが、メモリ管理システムからはまだ使用しているように見える状態となる。
これを、メモリリークと呼びます。
解放されたメモリを使用してしまうのも、プログラムがクラッシュする原因となる。


日時: 2008年06月17日 13:14
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/277

この記事にトラックバックされる方は、参照先が分かるようにするために、「delete演算子」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - C言語とC++勉強ルーム