中川さん、 こんにちは。
サイトウです。
すでに該当するリーク個所は解決していると思いますが、
私もデバッグ技法には関心があるので、識者がResを付けてくれるのを
待ってましたが、きませんね。
DLLの製作はやったことがありませんが、
以下は、自分が使ったことがある方法です。
class superbase {
protected:
#ifdef _DEBUG
char name[32];
#endif
public:
};
というクラスを全てのクラスの 基底クラスにする。
そして、全てのクラスのコンストラクタで
myclass::myclass()
{
#ifdef _DEBUG
strcpy( name, "myclass");
#endif
ということをすると、リークしたのが myclassなら
Detected memory leaks!
Dumping objects ->
{54} normal block at 0x00AD15C0, 328 bytes long.
Data: < BD myclass > AC 42 44 00 53 74 6F 70 42 75 74 74 6F 6E 55 49
てな感じ出力されるのでヒントになります。
インスタンスを特定したければ、
strcpy( name, "myclass");
を微妙に変えれば。
リークしてるのが、クラスでなくても
C++なら new と delete をオーバーライドして、
(Cなら malloc と free を再定義して)
同じような仕組みを作れば良いと思います。
答えになっていなかったらすみません。
On Fri, 21 Apr 2000 15:58:08 +0900
"Masato Nakagawa" <n...@ojk.info.gifu-u.ac.jp> wrote:
> 中川@岐阜大学です。
>
> DLLのメモリリークの検出方法についてわからない点があります。
>
> コンソールアプリケーションを作成した場合に、メモリリークを検出するために、以
> 下のようなコードを作成しました。
>
> #if defined( _DEBUG )
> int dbg_flag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
> dbg_flag |= _CRTDBG_LEAK_CHECK_DF;
> _CrtSetDbgFlag( dbg_flag );
> // _CrtSetBreakAlloc( 36 ); <===== (A)
> #endif
>
> このプログラムを実行するとプログラムの終了とともに、メモリリークの検出が行わ
> れて、
>
> Detected memory leaks!
> Dumping objects ->
> {36} normal block at ...
>
> というような出力が得られます。
> この「36」という値を上記の(A)の部分に与えてコメントをはずして、コンパイル、
> 実行すると、リークの原因となるメモリの獲得場所を特定することができます。何度
> プログラムを実行しても、プログラムを変更しない限り、同じ割り当て番号が得られ
> るので、この方法はうまくいきました。
>
> ところが、同様の作業をDLLに対して行うと、ソースを変更しなくても、プログラム
> の実行のたびに、ダンプ結果が異なる数字を出力します。
> そのため、一度実行して、得られた割り当て番号(例えば「36」)を(A)の部分に与え
> ても、意味がないのではないかという気がしているのです。確かに、ブレークポイン
> トは設定されて、プログラムも停止するのですが、これを目的のブレークポイントと
> 考えていいのかがよく分かりません。
>
> で、質問は次のようになります。
>
> DLLのメモリリーク検出の場合は特別なことをしなければいけないのでしょうか?
> それとも、コンソールアプリと同じようにメモリリークを検出できると考えていいの
> でしょうか?
> また、同じ方法でよい場合、毎回違う割り当て番号に対しては、どう対処したらよい
> のでしょうか?
>
> 何か情報をお持ちの方は教えていただけませんか?
> よろしくお願いします。
-----------------------------------
サイトウ ヒロシ
H...@pob.org
MP3プレイヤー "LinePlayer1.00"
http://www.din.or.jp/~saitoke/lineplayer/readme.html
サイトウです。
すでに該当するリーク個所は解決していると思いますが、
私もデバッグ技法には関心があるので、識者がResを付けてくれるのを
待ってましたが、きませんね。
DLLの製作はやったことがありませんが、
以下は、自分が使ったことがある方法です。
class superbase {
protected:
#ifdef _DEBUG
char name[32];
#endif
public:
};
というクラスを全てのクラスの 基底クラスにする。
そして、全てのクラスのコンストラクタで
myclass::myclass()
{
#ifdef _DEBUG
strcpy( name, "myclass");
#endif
ということをすると、リークしたのが myclassなら
Detected memory leaks!
Dumping objects ->
{54} normal block at 0x00AD15C0, 328 bytes long.
Data: < BD myclass > AC 42 44 00 53 74 6F 70 42 75 74 74 6F 6E 55 49
てな感じ出力されるのでヒントになります。
インスタンスを特定したければ、
strcpy( name, "myclass");
を微妙に変えれば。
リークしてるのが、クラスでなくても
C++なら new と delete をオーバーライドして、
(Cなら malloc と free を再定義して)
同じような仕組みを作れば良いと思います。
答えになっていなかったらすみません。
On Fri, 21 Apr 2000 15:58:08 +0900
"Masato Nakagawa" <n...@ojk.info.gifu-u.ac.jp> wrote:
> 中川@岐阜大学です。
>
> DLLのメモリリークの検出方法についてわからない点があります。
>
> コンソールアプリケーションを作成した場合に、メモリリークを検出するために、以
> 下のようなコードを作成しました。
>
> #if defined( _DEBUG )
> int dbg_flag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
> dbg_flag |= _CRTDBG_LEAK_CHECK_DF;
> _CrtSetDbgFlag( dbg_flag );
> // _CrtSetBreakAlloc( 36 ); <===== (A)
> #endif
>
> このプログラムを実行するとプログラムの終了とともに、メモリリークの検出が行わ
> れて、
>
> Detected memory leaks!
> Dumping objects ->
> {36} normal block at ...
>
> というような出力が得られます。
> この「36」という値を上記の(A)の部分に与えてコメントをはずして、コンパイル、
> 実行すると、リークの原因となるメモリの獲得場所を特定することができます。何度
> プログラムを実行しても、プログラムを変更しない限り、同じ割り当て番号が得られ
> るので、この方法はうまくいきました。
>
> ところが、同様の作業をDLLに対して行うと、ソースを変更しなくても、プログラム
> の実行のたびに、ダンプ結果が異なる数字を出力します。
> そのため、一度実行して、得られた割り当て番号(例えば「36」)を(A)の部分に与え
> ても、意味がないのではないかという気がしているのです。確かに、ブレークポイン
> トは設定されて、プログラムも停止するのですが、これを目的のブレークポイントと
> 考えていいのかがよく分かりません。
>
> で、質問は次のようになります。
>
> DLLのメモリリーク検出の場合は特別なことをしなければいけないのでしょうか?
> それとも、コンソールアプリと同じようにメモリリークを検出できると考えていいの
> でしょうか?
> また、同じ方法でよい場合、毎回違う割り当て番号に対しては、どう対処したらよい
> のでしょうか?
>
> 何か情報をお持ちの方は教えていただけませんか?
> よろしくお願いします。
-----------------------------------
サイトウ ヒロシ
H...@pob.org
MP3プレイヤー "LinePlayer1.00"
http://www.din.or.jp/~saitoke/lineplayer/readme.html