忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

メモリリークを簡単に探そう

ども、こんばんわ~

最近こたつが恋しいZAKIです

部屋が狭くてこたつ置けないんですよねぇ…

いいなぁ、こたつ…


さて、今回のテーマは「メモリリークを探せっ!」です。

メモリリークとはプログラム中で確保したメモリ(画像データ、new,mallocなど)を開放し忘れて残してしまうことです

こいつが残り続けるとどんどん使用可能メモリが無くなってOSがフリーズすることがあります(一回ありました

探すにも一つずつコードを調べていくのも面倒。

そこで!プログラムで表示させちゃいましょー!
 

拍手[1回]



今回の記事のサンプルは以前公開したシーン制御のVS(CC++)版のmain.h,main.cppに書いてあります。

まず、方法ですが、結構簡単です

#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#define new  ::new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#define malloc(p1)  _malloc_dbg(p1,_NORMAL_BLOCK,__FILE__,__LINE__)



このコードを全てのソースで定義されるようにします。

ヘッダに書いて全てのソースでインクルードするとかが妥当ですかね


_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF )


後はこのコードをプログラムの一番最初に書けばOKです

うまくいけばプログラム終了時にVS(VC++)なら出力コンソールに、dglibならDOS窓にリークしたメモリを確保したファイルと行を表示してくれます

と、これでうまくいけば万々歳なんですが、そうもいかないんです

defineでnewとmallocの定義を置き換えるので、これ以下の行でnewの定義などをしていれば、

もちろんエラーが出ます。

DirectXのd3d9.hなどではnewの定義をしています。

ということは、

このコードの下でd3d9.hなどをインクルードしていれば置き換えられてしまい、エラーがでてしまいます

なので、このコードを書くときはこのコードの下が自作のソースファイル、ヘッダファイルになるようにしましょう。

そうすると、WinAPI,DirectXの内部で確保したメモリは検出はされますが、場所は出てこないので、そこは自分でやるしかなさそうです

何故こういうことになるのかなどの詳しい話は下記ページを参考にすると良いと思います。

Microsoftの関連ページ
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnvc60/htm/MemLeaks.asp

結構わかりやすく書かれています
http://frog.raindrop.jp/knowledge/archives/000258.html


さて、今回は簡単に紹介してみました

毎回メモリリークには結構悩むので、結構重宝しています

よく_CrtDumpMemoryLeaks()ではリークが検出されて、_CrtSetDbgFlag()関数では出てこないという事態があります

恐らくSTL系のものの開放がプログラム終了時なのでmain()関数内で_CrtDumpMemoryLeaks()をコールした場合に検出されてしまうのではと思っています

この辺はいまいち僕も曖昧ですねすいません

とりあえず、今回はこの辺りで。

あでゅーノシ
PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]