ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

VC++で、「CStringを使ったとき、strcoreでメモリーリーク」のまとめ

2005-05-31 14:05:25 | Weblog

ウィリアムのいたずらも、ハマったし、検索しても、いろいろでてきますね。

    CStringを使ったとき、strcoreでmemory leaks

けっきょく、こんな感じのケースなんですけどね。。。




1.メソッド内で

  CString buf = "";
  for(int i = 0 ; i <10; i ++ )     buf = buf + "a";
  }

のように宣言したもので、ポインタでなく、newしたものでもない
  (なので、deleteもできない。こういうのは、メソッド終了後、解放されるはず)

2.スレッド内で使っていても、強制終了されたものではない。
  スレッドは、すでに終了しているのに、出る

3.文字列の連結や、format関数を使ったときに起こりやすい。
  ただし、これだけのケースだけでは、ないようだ。。。
  逆に、このとき、かならずなるわけでもない。
  バージョンによっても(VC++ Ver6、VC++ .net)同じプログラムで、
  出たり、出なかったりする


で、現象は、プログラム終了後、

 strcore.cpp(118) :
 で、メモリーリーク(memory leaks)がおきることがある
(かならずおきるわけではない)




原因:不明

回避策:
 CStringを使わない。charの配列で、文字列を表現し、連結するときは、メモリ領域を取り直して、コピーすると、メモリーリークにならない。

 うーん、これじゃあ、自動車事故を減らすには=自動車に乗らないっていうのと、おなじだな(>_<)!

 もっとも、中学校のとき、「忘れ物をなくすには?」というホームルームの話し合いで、「学校に荷物をすべて置いておく。わすれない!」と提案したことがある。

 「っていうことは、家で勉強しないツーことか?」とかいわれ、先生には、なぜか、反対され、その案は却下になったが、その日から、みんな学校に荷物を置くようになり、次の日から、忘れ物は激減した。。。

。。。って、関係ないか、この話(^^;)
この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 仕様書から単体テスト以外の... | トップ | 仕様書からテスト項目を抜き... »
最新の画像もっと見る

Weblog」カテゴリの最新記事