ページ 11

new と delete

Posted: 2010年11月04日(木) 21:20
by トム
つまらない質問です。

よくnewしたものはdeleteしなさいとよく言われるのでなんとなくしています。
しかしなぜdeleteしなければならないかという理由がまだよくわかっていません。
今までもしょっちゅうdeleteし忘れるのですが
困った事態にはまだ遭遇していません。

いちいちデストラクタを作ってdeleteするのは面倒なのでできればやりたくないのです。

deleteしないと具体的にどのような問題が発生するのでしょうか。
よろしくお願いします。

Re:new と delete

Posted: 2010年11月04日(木) 22:25
by Dixq (管理人)
ではたとえ話をしましょう。

newは図書館から1冊本を借りる作業だとたとえ、deleteはそれを返却する作業だとしましょう。

トムさんは今きっと100万冊も200万冊も本を抱える大きな図書館から借りているので、1冊や2冊返さなくてもパッと見わからないのだと思いますが、
「本の返却は面倒だから出来ればやりたくない」
ってのはちょっと酷いですよね。
100冊位しか本が無い図書館ならみんなが困ってしまうかもしれません。

同様に、newすると、限られたメモリ上から必要な分メモリが割り当てられます。
メモリのある領域を借りてくるような感じですかね。
必要なくなったのに返却しなかったらドンドン借りてきたものが貯まっていきます。
試しに膨大な数のnewを繰り返してみてください。
タスクマネージャーのメモリ使用量がドンドン上昇すると思います。
1Gしかメモリが無い状態でアプリが1Gメモリの領域を確保してしまうとOSや他のソフトが使えるメモリがなくなってしまいます。
結果スワップが発生して、極端に処理が遅くなることになるでしょう。
必要のないメモリは解放してやる事が大事です。

今現在影響がないように見えるのは、PCに大量のメモリがある為実質影響がないように見えているだけでしょう。

Re:new と delete

Posted: 2010年11月04日(木) 22:41
by トム
管理人さん分かり易いたとえ話ありがとうございます。
なるほど、今影響がないのはメモリが豊富なおかげなんですね。

ひとつ確認しておきたいのですが、
deleteし忘れたメモリ領域が元に戻るのは再起動したときくらいで、
アプリケーションが終了しただけではずっと残っているということでよろしいでしょうか。

Re:new と delete

Posted: 2010年11月04日(木) 22:50
by Dixq (管理人)
いえ、プログラムが一般的に使うメモリ領域はOSが使用する領域とは違うので、プログラムが終了すると解放されます。
ただし特別なAPIを使ってメモリを割り当てた場合などは残る場合もあるかもしれません。

Re:new と delete

Posted: 2010年11月04日(木) 22:56
by fr
ただdeleteをしたくないというならば、
#include<memory>にあるstd::tr1::shared_ptr辺りを調べるのも良いかもしれません。
VS2010なら使えます。

Re:new と delete

Posted: 2010年11月04日(木) 23:11
by トム
・管理人さん
よくわかりました。
こんな質問に丁寧に答えてくださりありがとうございます。

・frさん
ありがとうございます。
ただ私はそこまで深く入るレベルにないので
心の隅に留めておいてもう少し腕が上がった時に見てみます。