■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
メモリーリーク発見方法
1 名前: C++の弱点? 投稿日: 2000/09/23(土) 13:19
なんか良い方法ありませんか?
スマートで分かりやすいヤツがあったらご教授下さい。



2 名前: >1 投稿日: 2000/09/23(土) 13:23
とりあえずコードガード使え。


3 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/23(土) 17:22
わし、BoundChecker買おうと思っとるんじゃけど、
どうかのう。


4 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/23(土) 18:06
バンズとピュリはどっちがいいの?
コードウォリアーはどうでしょ?

詳しいひと教えてちょ。


5 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/23(土) 18:30
内部の状況をグラフで表示できる独自のmalloc実装した。
予めプールを予約してその範囲内でとる奴。
10年前UNIXーSVR4で使った。今は使って無くて
全然メンテしてないからいまの環境で使えるかは分からない。
もし迷惑でなかったら一週間以内にここでアップするけど。



6 名前: >5 投稿日: 2000/09/23(土) 22:22
アップしてください。お願いします


7 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/23(土) 22:40
いいのね。じゃ一週間以内にまた。



8 名前: 1 投稿日: 2000/09/24(日) 01:37
>2
コードガードとは一体どんなものなんですか?
ツールみたいなものなんでしょうか?





9 名前: 1 投稿日: 2000/09/24(日) 01:41
>2&3
BoundCheckerもコードガードも
検索しても見つかりません。
サイト紹介していただけませんか?


10 名前: 3 投稿日: 2000/09/24(日) 01:58
BoundChecker(代理店)はココ
http://www.xlsoft.com/jp/products/Bc/bchecker.html



11 名前: 1 投稿日: 2000/09/24(日) 03:44
>10
すげー高くないっか?
VC++より高い・・・。これは買えないっす・・・。
もっと安価なもの無いでしょうか。
とりあえずVC++より高いのはやだなぁ。


12 名前: 10 投稿日: 2000/09/24(日) 03:51
そうそう、
Code GuardはBorland C 5.0(BCBの前)についてます。
BC5.0は、いま、インプライズで格安で在庫処分やってます。

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

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

あと、BC5についているCGは、VCからは使えません。



13 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/24(日) 05:34
BCB5にもCodeGuard組み込まれてなかったけか?
VCとかからも使えるような独立したものなのかは知らない。


14 名前: 1 投稿日: 2000/09/24(日) 14:04
うーん。new/deleteをログ吐くようにオーバーロードして、
ちくちく確認していくしか無いんでしょか。
なんかめんどくさいなぁ。
(他人のコードをデバッグするのウザイっす)

VC++のヘルプに載ってるのは、タダのマクロだし・・・



15 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/24(日) 14:37
コピーコンストラクタをマメに書く。


16 名前: 1 投稿日: 2000/09/25(月) 05:53
とりあえず全ての基底クラスなるクラスに
new/deleteを宣言してログを出すようにしてみました。
解らない事は無いけどなんかprintfデバッグみたいで嫌。
基底のコンストラクタ/デストラクタに参照カウンタを装着して、
デストラクタで0になったらメッセージボックス出したりすると
ステキかつわかりやすいかな?(出なかったら駄目)

>15
??コピーコンストラクタ書くと良いんですか?
どのような効果が期待できるのでしょう?



17 名前: >16 投稿日: 2000/09/25(月) 09:29
なんでprintfデバックが嫌なの? プロジェクトが巨大でコンパイルが遅いとか?
だったらモジュール分けして動的に再ロード出来るようにするとかすればいいんじゃない?

参照カウンタ付けるなら、名前も付けりゃいいんじゃない?
で全部のヒープリストをダンプ出来る機能を作ればいいかと


18 名前: 64 投稿日: 2000/09/25(月) 10:07
BoundsChecker6.01は仕事で使ってます。Delphi5、
VC++6と一緒に使ってますが、メモリーリークは検
出できないことも多いです。Purifyも入手したので、
評価が終わり次第、書き込みます。


19 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/25(月) 10:11
つーか、コピーコンストラクタと代入演算子のオーバーロードは、
ちゃんとしてあげないと鼻から悪魔の原因になるからね。


20 名前: >1 投稿日: 2000/09/25(月) 10:49
実はVC++なら、グローバルのoperator new, operator deleteが書き換えられるよ。
ただし、この中ではC++の標準関数が使えない可能性があるから(coutですら動かない)、
Cでインプリメントしないといけないけどね。
ここでログ取ったら楽じゃない?


21 名前: 1 投稿日: 2000/09/25(月) 12:08
>20
ありがとうございます。
GlobalMalloc/GlobalFreeで実装すれば良いのかな。

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

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


22 名前: 1 投稿日: 2000/09/25(月) 12:18
間違えました、GlobalAllocですね。失礼。

各実装の注意点はこんなモンでよいのかな?
newの実装。
●if( size == 0 )size = 1;
●失敗時 throw std::bad_alloc;
●new_handlerは使わない事が解ってれば必要無いのかな?
deleteの実装。
●if( rawMemory == NULL )return;



23 名前: 1 投稿日: 2000/09/25(月) 12:49
グローバルなnew/deleteをオーバーロードしてログ吐き出したら、
ものすごい量のログになってしまいました。

テーブルにアドレスのリストを持っておいて、
アプリ終了時に開放されてない部分のログだけを吐き出したいんですが、
アプリの最後にデストラクタが呼ばれるクラスってどうやって見つける/指定すれば良いのでしょう?
ご存知のかたがいらっしゃったら教えてください。



24 名前: 名無しの笛の踊り 投稿日: 2000/09/25(月) 13:03
>23
MAINをちょっと書き換えて一段下げて、MAINを出たらログ吐き
したらだめ?


25 名前: 20 投稿日: 2000/09/25(月) 14:30
今、友達聞いたらDEBUG_NEWなるものがあるらしい。
MSDNで調べてくれい。ちょっと、使ったことないので微妙。


26 名前: 1 投稿日: 2000/09/25(月) 19:40
>24
最後にデストラクタが呼ばれるものは、
グローバルに宣言されてるクラスです。
全てnewでインスタンス化する形にできれば良いのですが、
(調べてないけど)多分staticなクラスメンバも同じ扱いのため、
ちょっと無理です。
こうなってくるとどのデストラクタが最後に呼ばれるか解らなくなってしまうのです。
>25
これただのマクロみたいなんで、クラス内でオーバーライド宣言してる
operator newが影響を受けてしまう気がします。
だいじょぶなんでしょうか。
まあ百聞は一見にしかずという言葉もあるので、暇が出来たら試してみます。



27 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/25(月) 21:43
>26
なんでC++でグローバルにクラスインスタンス作ってるの?
シングルトンにしときーな。

VC++APPWIZのtheAppは、単に設計者があほなだけ。



28 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/25(月) 23:43
をを、C++ってシングルトンの指定とか出来るようになったんだ。
勉強になったよ。


29 名前: 1 投稿日: 2000/09/26(火) 00:39
>27
すいません。
シングルトンとはどのような意味/効果なんでしょうか?
教えていただけると嬉しいです?



30 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/26(火) 01:04
>29
あるオブジェクトのインスタンスをプロセス内で
一個だけに制限する常套手段。
デザインパターンの一種。


31 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/26(火) 01:35
>>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;



32 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/26(火) 01:40
static Create() { if (!singleFoo) singleFoo = new CFoo; }


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

にしないの?


33 名前: 32 投稿日: 2000/09/26(火) 01:48
あ、CFoo*やね。

どっちでもいいこったね。枝葉の事。
インスタンスの使い道によってだね。


34 名前: 28>31 投稿日: 2000/09/26(火) 01:55
を、コンストラクタ/デストラクタの呼ばれる順番が気になるなら
グローバルにするな、って話だったっけね(説明不足)
さんきゅー。


35 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/26(火) 09:34
5だけど、約束だから。
ここでアップはうまくいかないんで、下のURLへ。
http://www.fuel.co.jp/rmalloc.html
んーこういうとき気軽に使えるサーバーがあればいいんだけどね。
ringとかlinux.or.jpとかそうもいかない。




36 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/26(火) 10:28
シングルトンの対語って何?
クリキントン?



37 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/26(火) 10:43
ダブルトン。
うそ。対語なんてねーだろうよ



38 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/26(火) 11:26
マルチプラトン


39 名前: 名無しの笛の踊り 投稿日: 2000/09/26(火) 11:29
>36
マルチたん・・・ハァハァ


40 名前: 3 投稿日: 2000/09/27(水) 01:26
>18
BoundsChecker6.01は仕事で使ってます。Delphi5、
VC++6と一緒に使ってますが、メモリーリークは検
出できないことも多いです。

参考になります。

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

たのしみにしています。Thanks!!



41 名前: で、 投稿日: 2000/10/04(水) 04:01
どうだった?


42 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/06(金) 20:07
ツール使わずにやる場合、全部のヒープに固有の数か名前を付けないと
デバックの時に不便ですよね。
以前、Winで自作のライブラリでやった時は、
特定のメッセージ受け取ったら 全ヒープをファイルに吐くような仕掛けを
しといて、そのファイルを解析してリーク追跡したりしてたけど
今はどんな感じなのかな?


43 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/07(土) 10:36
めんどくさいのでGCを書いた。