トップページ⇒tech
43コメント12KB

メモリーリーク発見方法

■ このスレッドは過去ログ倉庫に格納されています
0001C++の弱点? NGNG
なんか良い方法ありませんか?
スマートで分かりやすいヤツがあったらご教授下さい。
0002>1 NGNG
とりあえずコードガード使え。
0003名無しさん@お腹いっぱい。 NGNG
わし、BoundChecker買おうと思っとるんじゃけど、
どうかのう。
0004名無しさん@お腹いっぱい。 NGNG
バンズとピュリはどっちがいいの?
コードウォリアーはどうでしょ?

詳しいひと教えてちょ。
0005名無しさん@お腹いっぱい。 NGNG
内部の状況をグラフで表示できる独自のmalloc実装した。
予めプールを予約してその範囲内でとる奴。
10年前UNIXーSVR4で使った。今は使って無くて
全然メンテしてないからいまの環境で使えるかは分からない。
もし迷惑でなかったら一週間以内にここでアップするけど。
0006>5 NGNG
アップしてください。お願いします
0007名無しさん@お腹いっぱい。 NGNG
いいのね。じゃ一週間以内にまた。
00081 NGNG
>2
コードガードとは一体どんなものなんですか?
ツールみたいなものなんでしょうか?


00091 NGNG
>2&3
BoundCheckerもコードガードも
検索しても見つかりません。
サイト紹介していただけませんか?
00103 NGNG
BoundChecker(代理店)はココ
http://www.xlsoft.com/jp/products/Bc/bchecker.html
00111 NGNG
>10
すげー高くないっか?
VC++より高い・・・。これは買えないっす・・・。
もっと安価なもの無いでしょうか。
とりあえずVC++より高いのはやだなぁ。
001210 NGNG
そうそう、
Code GuardはBorland C 5.0(BCBの前)についてます。
BC5.0は、いま、インプライズで格安で在庫処分やってます。

安いのがお望みなら、そちらのHP見てみては?

但しC++コンパイラとしては標準への対応にすこし難があります。

あと、BC5についているCGは、VCからは使えません。
0013名無しさん@お腹いっぱい。 NGNG
BCB5にもCodeGuard組み込まれてなかったけか?
VCとかからも使えるような独立したものなのかは知らない。
00141 NGNG
うーん。new/deleteをログ吐くようにオーバーロードして、
ちくちく確認していくしか無いんでしょか。
なんかめんどくさいなぁ。
(他人のコードをデバッグするのウザイっす)

VC++のヘルプに載ってるのは、タダのマクロだし・・・
0015名無しさん@お腹いっぱい。 NGNG
コピーコンストラクタをマメに書く。
00161 NGNG
とりあえず全ての基底クラスなるクラスに
new/deleteを宣言してログを出すようにしてみました。
解らない事は無いけどなんかprintfデバッグみたいで嫌。
基底のコンストラクタ/デストラクタに参照カウンタを装着して、
デストラクタで0になったらメッセージボックス出したりすると
ステキかつわかりやすいかな?(出なかったら駄目)

>15
??コピーコンストラクタ書くと良いんですか?
どのような効果が期待できるのでしょう?
0017>16 NGNG
なんでprintfデバックが嫌なの? プロジェクトが巨大でコンパイルが遅いとか?
だったらモジュール分けして動的に再ロード出来るようにするとかすればいいんじゃない?

参照カウンタ付けるなら、名前も付けりゃいいんじゃない?
で全部のヒープリストをダンプ出来る機能を作ればいいかと
001864 NGNG
BoundsChecker6.01は仕事で使ってます。Delphi5、
VC++6と一緒に使ってますが、メモリーリークは検
出できないことも多いです。Purifyも入手したので、
評価が終わり次第、書き込みます。
0019名無しさん@お腹いっぱい。 NGNG
つーか、コピーコンストラクタと代入演算子のオーバーロードは、
ちゃんとしてあげないと鼻から悪魔の原因になるからね。
0020>1 NGNG
実はVC++なら、グローバルのoperator new@` operator deleteが書き換えられるよ。
ただし、この中ではC++の標準関数が使えない可能性があるから(coutですら動かない)、
Cでインプリメントしないといけないけどね。
ここでログ取ったら楽じゃない?
00211 NGNG
>20
ありがとうございます。
GlobalMalloc/GlobalFreeで実装すれば良いのかな。

>17
結局人間がそれを解析してメモリリークを発見しなければならないからです。
バグありコードを生産してくれるプログラマはprintfデバッグを行うことすら期待できません。
出来る限り、人間の手を通さないでバグがある事をバグ生成者に通知したいんです。

とはいえ、ログを解りやすくする事はできるので、
perlでメモリーリーク部分だけ抜き出すようにしてみます。
ちなみに私自身printfデバッグは嫌いじゃありませんよ。
それを見ないやつがいるのが嫌なんです。
00221 NGNG
間違えました、GlobalAllocですね。失礼。

各実装の注意点はこんなモンでよいのかな?
newの実装。
●if( size == 0 )size = 1;
●失敗時 throw std::bad_alloc;
●new_handlerは使わない事が解ってれば必要無いのかな?
deleteの実装。
●if( rawMemory == NULL )return;
00231 NGNG
グローバルなnew/deleteをオーバーロードしてログ吐き出したら、
ものすごい量のログになってしまいました。

テーブルにアドレスのリストを持っておいて、
アプリ終了時に開放されてない部分のログだけを吐き出したいんですが、
アプリの最後にデストラクタが呼ばれるクラスってどうやって見つける/指定すれば良いのでしょう?
ご存知のかたがいらっしゃったら教えてください。
0024名無しの笛の踊り NGNG
>23
MAINをちょっと書き換えて一段下げて、MAINを出たらログ吐き
したらだめ?
002520 NGNG
今、友達聞いたらDEBUG_NEWなるものがあるらしい。
MSDNで調べてくれい。ちょっと、使ったことないので微妙。
00261 NGNG
>24
最後にデストラクタが呼ばれるものは、
グローバルに宣言されてるクラスです。
全てnewでインスタンス化する形にできれば良いのですが、
(調べてないけど)多分staticなクラスメンバも同じ扱いのため、
ちょっと無理です。
こうなってくるとどのデストラクタが最後に呼ばれるか解らなくなってしまうのです。
>25
これただのマクロみたいなんで、クラス内でオーバーライド宣言してる
operator newが影響を受けてしまう気がします。
だいじょぶなんでしょうか。
まあ百聞は一見にしかずという言葉もあるので、暇が出来たら試してみます。
0027名無しさん@お腹いっぱい。 NGNG
>26
なんでC++でグローバルにクラスインスタンス作ってるの?
シングルトンにしときーな。

VC++APPWIZのtheAppは、単に設計者があほなだけ。
0028名無しさん@お腹いっぱい。 NGNG
をを、C++ってシングルトンの指定とか出来るようになったんだ。
勉強になったよ。
00291 NGNG
>27
すいません。
シングルトンとはどのような意味/効果なんでしょうか?
教えていただけると嬉しいです?
0030名無しさん@お腹いっぱい。 NGNG
>29
あるオブジェクトのインスタンスをプロセス内で
一個だけに制限する常套手段。
デザインパターンの一種。
0031名無しさん@お腹いっぱい。 NGNG
>>28
こうするだけですよ。

class CFoo
{
private:
 static CFoo *singleFoo;
 CFoo();
 ~CFoo();
public:
 static Create() { if (!singleFoo) singleFoo = new CFoo; }
 static Destroy() { delete singleFoo; singleFoo = 0; }
};

CFoo *CFoo::singleFoo = 0;
0032名無しさん@お腹いっぱい。 NGNG
static Create() { if (!singleFoo) singleFoo = new CFoo; }
は

static CFoo Get() { if (!singleFoo) singleFoo = new CFoo;return singleFoo; }

にしないの?
003332 NGNG
あ、CFoo*やね。

どっちでもいいこったね。枝葉の事。
インスタンスの使い道によってだね。
003428>31 NGNG
を、コンストラクタ/デストラクタの呼ばれる順番が気になるなら
グローバルにするな、って話だったっけね(説明不足)
さんきゅー。
0035名無しさん@お腹いっぱい。 NGNG
5だけど、約束だから。
ここでアップはうまくいかないんで、下のURLへ。
http://www.fuel.co.jp/rmalloc.html
んーこういうとき気軽に使えるサーバーがあればいいんだけどね。
ringとかlinux.or.jpとかそうもいかない。

0036名無しさん@お腹いっぱい。 NGNG
シングルトンの対語って何?
クリキントン?
0037名無しさん@お腹いっぱい。 NGNG
ダブルトン。
うそ。対語なんてねーだろうよ
0038名無しさん@お腹いっぱい。 NGNG
マルチプラトン
0039名無しの笛の踊り NGNG
>36
マルチたん・・・ハァハァ
00403 NGNG
>18
BoundsChecker6.01は仕事で使ってます。Delphi5、
VC++6と一緒に使ってますが、メモリーリークは検
出できないことも多いです。

参考になります。

>Purifyも入手したので、評価が終わり次第、書き込みます。

たのしみにしています。Thanks!!
0041で、 NGNG
どうだった?
0042名無しさん@お腹いっぱい。 NGNG
ツール使わずにやる場合、全部のヒープに固有の数か名前を付けないと
デバックの時に不便ですよね。
以前、Winで自作のライブラリでやった時は、
特定のメッセージ受け取ったら 全ヒープをファイルに吐くような仕掛けを
しといて、そのファイルを解析してリーク追跡したりしてたけど
今はどんな感じなのかな?
0043名無しさん@お腹いっぱい。 NGNG
めんどくさいのでGCを書いた。
■ このスレッドは過去ログ倉庫に格納されています