• ベストアンサー

メモリの開放を全て行いたいが開放し損ねている VC++6.0 使用

こんにちは。 Win2000環境 VC++6を使用してあるアプリケーションを開発してまして そのアプリ終了時に、確保したメモリを開放しているのですが 「すべてのメモリを開放できませんでした」というような表示がされてしまいます。 (この表示文字自体は、そのアプリの仕様です。エラーチェックしてくれています) 自分ではmallocしたデータは全て開放しているつもりですが どのメモリ(変数)が開放し損ねているのかわからずに困っています。 VCのデバッグモードを使用して処理をたどってみても、場所が特定できません。 mallocしている部分をコメントアウト等して ちょっとづつでも場所を特定できればいいのですが、 諸事情により(プログラムの処理上)それができない形になっています。 皆さんは、メモリを開放させる処理で、どこかメモリを開放し損ねている場合 どのようにその場所を突き止めているのでしょうか? VC++のデバッグモードの何かしらの機能か何かで その場所を表示させるような事なのできないのでしょうか? ちょっとわかりにくい説明ですが、 ご存知の方、どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.7

#2 です。遅くなりました。 下記のイメージです。 void *mymyMalloc(size_t size, char *name) { /* malloc() を実行して、ポインタを得る。 成功したら、このポインタと size, name を(global 変数でリスト形式で)記憶して行く。 name は、"呼んでいる関数名:変数名"の文字列。 必要なら、この処理を逐一 log (text) file に書き出す。 */ } void mymyFree(void *ptr) { /* 記憶しているリストを見て、ptr とポインタの一致したものがあるなら、 リストから削除する。 free() を実行する。 */ } 最後にアプリケーションを終る際、リストを見て、解放洩れがあるかを調べる。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • RAPTsong
  • ベストアンサー率42% (74/175)
回答No.6

スマートポインタを使えばいいのでは? デストラクタで自動的に開放してくれます。 _CRTDBG_MAP_ALLOC …VC++6ではヘタレな実装になっているので、必ず crtdbg.hが該当ソースだと言われます。 inline void* __cdecl operator new(unsigned int s) { return ::operator new(s, _NORMAL_BLOCK, __FILE__, __LINE__); } インライン関数じゃぁ、当然だろ、と。 マクロのように展開されているならともかく…。

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

>VC++は、デバッグ版でコンパイルすると、デバッグ用のnew演算子とdelete演算子をオーバーライドします。 >ですから、mallocやfreeを使うのではなくnew・deleteを使ってみてはいかがですか? mallocやfreeを使わない理由になってないのですが。 そもそもnew、deleteとmalloc、realloc、freeは対応づいていません。 これらもデバッグコンパイルかつ_CRTDBG_MAP_ALLOCを指定すれば、マクロによってデバッグ用関数に置き換えられます。

すると、全ての回答が全文表示されます。
  • txrx
  • ベストアンサー率45% (83/184)
回答No.4

#1さんも書かれていますが、VC++には、初めからご要望の機能が組み込まれています。 デバッグバージョンのプログラム終了時に開放していないメモリブロックをソースファイルとその行番号で示してくれます。 また、クラス等を構築しているのであれば、そのクラス型等も出力ウィンドウに表示します。 未開放のメッセージ行をダブルクリックするだけで、そのソースコードを表示してくれます。 すごく便利です! VC++は、デバッグ版でコンパイルすると、デバッグ用のnew演算子とdelete演算子をオーバーライドします。 ですから、mallocやfreeを使うのではなくnew・deleteを使ってみてはいかがですか?

すると、全ての回答が全文表示されます。
  • keyguy
  • ベストアンサー率28% (135/469)
回答No.3

VC++でなく無償BorlandC++5.51でプログラミングしていますが 良い方法を考えました vector<char*> vpc_delete; と宣言し vpc_delete.push_back(pcx=new char[100]); のようにメモリ割り当てするたびにポインタをpush_backしておきます pcxの名前は各場所でメモリ割り当てをするときのダミー名です いっぱいあると思いますが実際に確保するときの名前に置き換えてください 最後の部分で for(unsigned pos=0;pos<vpc_delete.size();delete []vpc_delete[pos++]); をすれば確実です これのいいのはポインタpcxをすぐにポインタを代入するなどして再利用できる事です その都度メモリ開放する必要はありません すばらしい発明なので今の膨大なプログラムに採用しています

すると、全ての回答が全文表示されます。
  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.2

VC++ にはいい手段がありますが、 私は昔からの習慣で #ifdef DEBUG #define myMalloc(size,name) mymyMalloc((size),(name)) #else #deine myMalloc(size,name) malloc((size)) #endif という定義のもとで、mymyMalloc() で、メモリ管理をするようにしています。 realloc(), calloc(), free() も同じ方式で管理下において試しています。

majikaru
質問者

お礼

返答が遅くなりましてすみません。 ご返答ありがとうございます。 重ねての質問で大変申し訳ないのですが、 このような定義をしたとして その後、どうやってメモリ管理できるのでしょうか? mymyMallocという関数を別途用意するのでしょうか? (その時、nameはどのように使用する?) 使いやすいようなイメージがするので ご教授頂けると幸いです。 どうぞよろしくお願い致します。

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1
majikaru
質問者

お礼

返答が遅くなってすみません。 ご返答ありがとうございます。 貴重な情報ありがとうございます。 さっそく指定URLの記事を読んでようと思いますが ・・・なにやら難しそうですね(w

すると、全ての回答が全文表示されます。

関連するQ&A