プログラムの実行時にエラーで停止してしまいます。
数値計算系のプログラムで反復計算を行っています。
数万回反復させても大丈夫なのに100万回くらい反復
計算するとプログラムが停止します。
場合によりパソコンがフリーズします。
メモリ関連が原因であることは想像できるのですが
デバッグの方法がわかりません。計算の途中にでてくる
関数等でつかわれている変数でmallocしたものは全て
解放しているつもりですがどこかおちがあるのかもしれません。オチがある場合どこを解放しわすれているのか
現在つかめていません。
VCをつかっているのですがデバッガを使って実行途中の
メモリの状態を確認する方法など、この問題を解決する
為に有効であると思われる方法をご存じでしたら教えて
ください。
windows2000
visualC++6.0professional
メモリ256MB
No.2ベストアンサー
- 回答日時:
ひとことで説明するのは、ちと難しいのですが、VC には、それようの機能が備わっています。
参考URLからたどれるところをじっくりと読んでください。
ある程度大きなプログラムでは、とても有効です。
一連の手順を簡単にまとめると
・ある程度動かしたところで、残っているメモリの一覧を取る
・内容を確認し、解放しているはずかどうかの見当をつける
※この時点で、抜けている解放すべき処理の検討がつくことが多い
・解放しているはずのメモリ領域の割り当て番号を控える
・その番号に対してブレークポイントを設定する
・再度実行する
・スタックとレースをたどれば、割り当てている箇所が分かるので、その領域に対して、適切な解放処理を入れる
といった感じの手順の繰り返しになります。
参考URL:http://www.microsoft.com/japan/msdn/library/ja/v …
丁寧なご回答ありがとうございます。
まだヘルプをまだしっかり読めていないのですが
機能がついていると言うことは確認できました。
詳しく読んでいないので不確かですがメモリを確認する為の
関数などが用意されているようですね。
C言語はほぼVCのみで、そのレベルも入門書を一通りできるようにした程度
(現在は自分の知りたいことをMSDNからうまくみつけることができないレベルです・・・)なので
MSDNを読んで理解するだけの能力がまだありませんが的確な指示ありがとうございます。
No.4
- 回答日時:
a-kuma様が既に答えられているので蛇足かも知れませんが、
参考までに私の行っているリーク検出の手順を書かせて頂きます。
1:ビルドの種類を「デバッグビルド」に設定。
(コンパイル後のデータが、ワークスペース〔拡張子dsw〕と同フォルダ内の
『Debug』フォルダ内に作成される状態です、デフォルトでこの状態になって
いると思います)
2:メモリリークを検出したいプログラムの先頭に、デバッグに必要な
ヘッダーファイル「crtdbg.h」をインクルードします。
(複数のソースファイルに渡って調べたい場合は、調べたい全てのソースに
インクルードします)
3:プログラムが終了する直前の場所で、メモリリーク検出用の関数
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
を呼びます。
4:プログラムをリビルド→実行します。
5:異常終了させずにプログラムを終了させます。
(計算回数を調整する等で対処してみて下さい)
6:アウトプットの「デバッグ」欄に、リークしているメモリサイズが
出力されます。
(例:
Detected memory leaks!
Dumping objects ->
{112} normal block at 0x007D0E10, 4 bytes long.
Data: < > CD CD CD CD
3行目は解放されていないメモリのアドレスとそのサイズ、
4行目はその中身です。
*複数のリークがある場合は、その数だけ出力されます。
これはアドレス0x007D0E10から4バイトのメモリが解放されていないよ、
というメッセージです。
中身の「CD」は、リークを検出するためにVCが初期化している値ですので
エラーではありません。
)
更にリーク位置を特定することも出来ますが、余り手順が多すぎても分かり難い
と思いますので、とりあえずこの辺りで試してみてはいかがでしょうか。
*位置特定が必要であれば、下手な説明でありますがお答えしたいと思います。
忙しかった為、返信できませんでした。
大変丁寧な説明ありがとうございます。
手順はだいたいわかったのですが6の表示の意味が
わからなくて困っていました。大変参考になります。
ありがとうございました。
No.3
- 回答日時:
作成したアプリケーションの規模にもよりますが、『既に存在するメモリーリークを完全に排除する一般的な手段』はありません。
また、『既に存在するメモリーリークを完全に検出する一般的な手段』はメモリーリーク検出ツールを使う以外にはありません。
☆ ココで言う『完全』とは「OS、ライブラリ(LIB,DLL,OCXなどを含む)で発生するメモリーリークを含む」と言う意味です。
自作のコード内で発生するメモリーリークのみに着目した場合、#2の方法で検出が可能かと思われます。
しかし、OSやライブラリで発生するメモリーリークに関してはRational Purify(<<高価>>ですが<<効果>>もすごい!)などを使用して検出する以外に『完全な』検出方法はありません。
また、有名な『Windows95のリソースリーク』のように「検出は出来ても修正する手段が存在しない」ということもあるのでご注意ください。
参考URL:http://www.rational.co.jp/products/purify_nt/ind …
ご回答ありがとうございます。
メモリリーク検出ツールというものがあるとは知りませんでした。
自作コード内で発生している物と思われる為a-kumaさんの
教えてくださった方法を習得する方向でいきたいと思います。
メモリリーク検出ソフトも調べてみたいと思います。
質問に対する解決が得られたのですが一応もう数日間
締め切らないでおきますのでご了承ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 数学 至急!研究の統計について 6 2023/07/12 00:38
- 化学 化学のエンタルピ変化を求め方について ある例題では各物質のモール数を換算して計算することもあり、ある 1 2022/06/20 23:22
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Excel(エクセル) エクセル・スプレッドシートで、一定数を超えたらゼロから再累計する方法 8 2022/05/28 03:52
- その他(自然科学) 論文のまとめに関して(小論文)添削お願いします。 6 2023/07/16 14:24
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- 高校 有効数字計算 確定した値を含む 2 2023/01/18 06:03
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスを前面に表...
-
C#でButtonのフォーカス枠を消...
-
TDSマジックランプシアター 箱...
-
SPREAD(GrapeCity)のセルにフォ...
-
コンボボックスの開いたリスト...
-
コンボボックスの三角を一時的...
-
iPhoneのクイックアクションを...
-
PowershellでCLIとISEの結果が違う
-
雷のようなアニメーションをウ...
-
Excelのマクロで実行時エラー”1...
-
Giam
-
Eclipse Javaエディタでの選択...
-
タスクバーに文字列を表示した...
-
iPhoneのSuicaアプリについて教...
-
DAMのデンモクの使い方
-
Chrome フォーカス時に枠が表示...
-
ExcelVBAのフォームサイズについて
-
Macのウィンドウが透ける
-
DataGridViewで入力チェック後...
-
無線LANルーターについて… 無線...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスを前面に表...
-
SPREAD(GrapeCity)のセルにフォ...
-
C#でButtonのフォーカス枠を消...
-
Excelのマクロで実行時エラー”1...
-
Chrome フォーカス時に枠が表示...
-
iPhoneのクイックアクションを...
-
コンボボックスの開いたリスト...
-
TDSマジックランプシアター 箱...
-
コンボボックスの三角を一時的...
-
レーザのスポット径の計算式
-
雷のようなアニメーションをウ...
-
DAMのデンモクの使い方
-
初期フォーカスについて
-
ASP.NETにてロストフォーカス処理
-
至急です。 トイレに行きたいな...
-
PowershellでCLIとISEの結果が違う
-
パソコンの液晶画面にマジック...
-
Eclipse Javaエディタでの選択...
-
除光液の正しい捨て方がわかり...
-
手からビームって出せるんです...
おすすめ情報