ページ 11

delete[/url] について

Posted: 2007年9月14日(金) 10:18
by さなお
はじめまして。C++のnew/deleteについて質問させて下さい。
とっても初心者的な質問で、とっても恥ずかしい質問かも知れませんが
教えていただけるととっても助かります。よろしくお願いします。
配列を動的にメモリを割り当てるためにnewを使いdeleteでメモリを解放させるというやり方がありますよね。
その時ポインタが有効かそうでないかを判断するのにはポインタがNULLであるかで判断するというのが
正しいコーディングだと理解しています。
もしも、newで割り当てたメモリをdeleteで解放する前にNULLで初期化を間違ってしてしまった場合
どんな影響が出るのかが知りたいと思います。やはりメモリは解放されませんか?

例として
char *pn=NULL;

if (pn==NULL)
pn = new char[20];
.
.
.

pn = NULL;



delete[/url] pn;

例では、deleteでメモリの解放は最終的に行うのですが
その前にポインタをNULLにしてしまったという場合です。

こんな事をすると、メモリリークが起こるとか
メモリの共用違反の原因になりますか?

とっても恥ずかしい質問ですみません。
例の事をやった場合に起こる事の問題の可能性などを
教えていただけると、とてもありがたく思います。
よろしくお願い致します。

Re:delete[/url] について

Posted: 2007年9月14日(金) 10:23
by Blue
>こんな事をすると、メモリリークが起こるとか
メモリリークしますよ。

NULLを設定しなくても
char* p = NULL;

p = new char[10]; // 1
p = new char[5];  // 2

delete[/url] p;
とすると、1でnewした領域は解放できないのでリークします。
今回は 2 が単に NULL だということです。

Re:delete[/url] について

Posted: 2007年9月14日(金) 11:27
by さなお
Blueさん、とっても早くにお返事いただけてありがとうございます。
やはりメモリリークの原因になりますよね・・・。

では、もう一つ追加で聞かせていただいて良いですか?
書いていただいた例では1でnewした領域は解放できませんが
2で書いたnewの領域は解放出来てますよね?

でももし、私が書いた例のように
ポインタをNULLにしてしまった場合
delete[/url] pn;
の行は何を解放しにいっているのでしょうか?
ここも何かのエラーの原因になりうりますか?

追加質問ですみません。
よろしくお願い致します。

Re:delete[/url] について

Posted: 2007年9月14日(金) 11:33
by Blue
>ポインタをNULLにしてしまった場合
>delete[/url] pn;
>の行は何を解放しにいっているのでしょうか?
は確か何も問題ないはず。
(だけどNULLにする前の領域は当然解放できない)

気持ちが悪いなら

if (pn != NULL)
delete[/url] pn;

と条件文を入れればいいでしょう、

Re:delete[/url] について

Posted: 2007年9月14日(金) 12:09
by たかぎ
動作を正しく理解することは重要ですし、避けて通ることはできませんが、メモリ管理で楽をしたいのであれば、配列を new で割りつけるのではなく std::vector クラステンプレートを使用することをお勧めします。

Re:delete[/url] について

Posted: 2007年9月14日(金) 13:07
by さなお
Blueさん早速のお返事ありがとうございます。
本来あってはならない事なので
教えていただいたように条件文を付けるようにして
これ以上の問題を起こさないように対処していくようにします。

たかぎさん、お返事ありがとうございました。
クラステンプレートとか使用したことない初心者です。
これを使う方が安全に出来るのですね?
楽もしたいですが、でも、基本的な動作も理解したいと思います。
クラステンプレートの方も追って勉強できればと思っています。
教えていただきましてありがとうございます。