メモリーリークの取り方 – プログラミング – Home

メモリーリークの取り方
 
通知
すべてクリア

メモリーリークの取り方


kai
 kai
(@kai)
ゲスト
結合: 23年前
投稿: 64
Topic starter  

お世話になっています。
Win2000, VC6.0, MFC, SDIで作成しています。

CMemoryStateというクラスを使ってメモリーリークをチェックしたところ

1 plex.cpp(31)
2 afxtempl.h(1232)
3 map_ss.cpp(74)
4 strcore.cpp(118)でリークをしているようです。

それぞれ何が原因なのかご教授願えませんでしょうか?
よろしくお願いします。


引用解決済
トピックタグ
kai
 kai
(@kai)
ゲスト
結合: 23年前
投稿: 64
Topic starter  

追加質問です。

アウトプットウィンドウに
strcore.cpp(118) : {70} normal block at 0x01xxxx, 50 bytes long.

と出たので、ここをダブルクリックすると、 strcore.cpp ファイルが見つかりません
とメッセージが出ます。
MFCのソースをデバッガ上から見えるようにしたり、ブレークポイントをはったり
するにはどう設定すればよいのでしょうか?

お願いします。m(__)m


返信引用
ボコノン教徒
 ボコノン教徒
(@ボコノン教徒)
ゲスト
結合: 22年前
投稿: 90
 

VC++をインストールする時、MFCのソースをインストールしたのでしょうか?
そうでなければ、追加インストールしてください。

> strcore.cpp(118) : {70} normal block at 0x01xxxx, 50 bytes long.

こちらでMFCのソースを見ると、CStringがリークしています。

>map_ss.cpp(74)

74: CString *a = new CString(HOGE);
とかやった後に、このa を delete してない、とか。


返信引用
kai
 kai
(@kai)
ゲスト
結合: 23年前
投稿: 64
Topic starter  

ボコノン教徒さん お返事ありがとうございます。

>そうでなければ、追加インストールしてください。
>> strcore.cpp(118) : {70} normal block at 0x01xxxx, 50 bytes long.
>こちらでMFCのソースを見ると、CStringがリークしています。
>
>>map_ss.cpp(74)
>74: CString *a = new CString(HOGE);
>とかやった後に、このa を delete してない、とか。

new はいっさい使っていません。

CMapStringToString クラスをAppのメンバに持っています。
SetAt()で追加していったら、何か解放処理が必要なのでしょうか?
リークの心配がないと思って使ってみたのですけれど。。。(T_T;;;

アドバイスお願いします。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> CMapStringToString クラスをAppのメンバに持っています。

> SetAt()で追加していったら、何か解放処理が必要なのでしょうか?

> リークの心配がないと思って使ってみたのですけれど。。。(T_T;;;

Checkpointの間でSetAtを使っていないですか?

リークしていなくても,ヒープの使用状態が変化していますから,

当然,CMemoryStatus::Differenceは「異なっている」と言ってきますよ。


返信引用
kai
 kai
(@kai)
ゲスト
結合: 23年前
投稿: 64
Topic starter  

YuOさん お返事ありがとうございます。

>Checkpointの間でSetAtを使っていないですか?

そうなのですか。
気持ち悪かったので、CMapStringToStringを使うのをやめたのですが
あいかわらず

strcore.cpp(118) : {70} normal block at 0x01xxxx, 50 bytes long.

が出てしまいます。
MFCのソースはインストールされているのですが、アウトプットウィンドウに出た

strcore.cpp(118) : {70} normal block at 0x01xxxx, 50 bytes long.
の行をダブルクリックした時に strcore.cppの118行が表示されるようにするには
どうしたらよいのでしょうか?
表示されれば、ブレークポイントを設定してデバッグできると思います。
何か設定が必要なのでしょうか?

よろしくお願いします。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

スレッドを強制終了したりしてませんか?

> 表示されれば、ブレークポイントを設定してデバッグできると思います。
> 何か設定が必要なのでしょうか?

strcore.cppを手作業で開けば、ブレークポイントを設定できますよ。


返信引用
kai
 kai
(@kai)
ゲスト
結合: 23年前
投稿: 64
Topic starter  

dairygoodsさん お返事ありがとうございます。

>スレッドを強制終了したりしてませんか?

していないと思います。
少なくとも、そういうコーディングはしていません。

>strcore.cppを手作業で開けば、ブレークポイントを設定できますよ。

ファイルを開いて、行を移動してブレークポイントを設定できました。

プログラムの起動から終了まででアウトプットウィンドウに
strcore.cpp(118) : {70} normal block at 0x01xxxx, 50 bytes long.
の行が10回出力されます。
いつも10回であれば、リークはしていないと考えてよいでしょうか?

CStringクラスのコンストラクタとか CString::Format()が実行されても
この行にくるようです。

アドバイスをお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました