C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: メモリリークについて


(過去ログ 56 を表示中)

[トピック内 21 記事 (1 - 20 表示)]  << 0 | 1 >>

■31678 / inTopicNo.1)  メモリリークについて
  
□投稿者/ シープラザ (1回)-(2009/01/27(Tue) 13:18:32)

分類:[C/C++] 

VC++を勉強中のシープラザと申します。

今年に入ってから急にWindowsXPでVC++(2003)のシステムメンテナンスをする事になり、必死で勉強してます。
ずっとVBA畑だったので何から何までが難しく、一進一退を繰り返しております。
コンパイルが無事通っても喜びも束の間、実際にシステムを立ち上げてみてから発覚するバグも多いです。
そこで質問なのですが、コンパイルが無事通った後のメモリリークについてです。
一連の操作が無事動作し、胸を撫で下ろしてシステムを終了しようとすると「メモリアクセス違反」のエラーが出てしまいます。
どこかでメモリ解放を忘れているのか不適切な宣言・解放でも噛ませているのか…なのでしょうが…
なにせシステムが大きい為、一つ一つ見ていくのに時間を取られてしまっています。
方法としては、一つずつ変数や関数をコメントアウトして無事通るか…みたいな。
どこかで「ココ確認してみ!」「この変数がおかしい!」みたいなログというか出てないんでしょうか?
エラーで原因のアドレスは表示されますが、確保領域は毎回変わるので参考にならない気がするのですが…

どなたかいい方法をご存知の方がいらっしゃいましたらご教授をお願いします。
引用返信 編集キー/
■31680 / inTopicNo.2)  Re[1]: メモリリークについて
□投稿者/ Blue (2回)-(2009/01/27(Tue) 13:25:33)
No31678 (シープラザ さん) に返信
> VC++を勉強中のシープラザと申します。
>
> 今年に入ってから急にWindowsXPでVC++(2003)のシステムメンテナンスをする事になり、必死で勉強してます。
> ずっとVBA畑だったので何から何までが難しく、一進一退を繰り返しております。
> コンパイルが無事通っても喜びも束の間、実際にシステムを立ち上げてみてから発覚するバグも多いです。
> そこで質問なのですが、コンパイルが無事通った後のメモリリークについてです。
> 一連の操作が無事動作し、胸を撫で下ろしてシステムを終了しようとすると「メモリアクセス違反」のエラーが出てしまいます。
> どこかでメモリ解放を忘れているのか不適切な宣言・解放でも噛ませているのか…なのでしょうが…
> なにせシステムが大きい為、一つ一つ見ていくのに時間を取られてしまっています。
> 方法としては、一つずつ変数や関数をコメントアウトして無事通るか…みたいな。
> どこかで「ココ確認してみ!」「この変数がおかしい!」みたいなログというか出てないんでしょうか?
> エラーで原因のアドレスは表示されますが、確保領域は毎回変わるので参考にならない気がするのですが…
>
> どなたかいい方法をご存知の方がいらっしゃいましたらご教授をお願いします。
引用返信 編集キー/
■31681 / inTopicNo.3)  Re[2]: メモリリークについて
□投稿者/ Blue (3回)-(2009/01/27(Tue) 13:27:47)
すみません、まちがって返信してしまいました。

>一連の操作が無事動作し、胸を撫で下ろしてシステムを終了しようとすると「メモリアクセス違反」のエラーが出てしまいます。
はメモリリークとはまた別なのではないでしょうか?
VC++ということなのでデバッグモードで実行して、セグメントエラーが出そうなところにあたりをつけて
ブレイクポイントを設置し、どんどん絞り込んでみるとか。
引用返信 編集キー/
■31682 / inTopicNo.4)  Re[1]: メモリリークについて
□投稿者/ オショウ (82回)-(2009/01/27(Tue) 13:30:53)
> どなたかいい方法をご存知の方がいらっしゃいましたらご教授をお願いします。

  私は、下記ソフトを使ってバグつぶししました。
  ttp://www.xlsoft.co.jp/jp/products/devpartner/index.html

  参考までに

以上。
引用返信 編集キー/
■31683 / inTopicNo.5)  Re[1]: メモリリークについて
□投稿者/ .SHO (578回)-(2009/01/27(Tue) 13:32:48)
No31678 (シープラザ さん) に返信

> システムを終了しようとすると「メモリアクセス違反」のエラーが出てしまいます。

自分ならとりあえず、終了ルーチンを疑います。
引用返信 編集キー/
■31684 / inTopicNo.6)  Re[2]: メモリリークについて
□投稿者/ 774RR (302回)-(2009/01/27(Tue) 13:44:48)
アクセス違反とメモリリークは別物なので、どっちなのかはっきりしないと
アドバイスとしては方向性が変わってくるわけだが。

とりあえずリークなら MFC のリークチェック機能でもそこそこは使える。
アクセス違反なら、メモリぶっ壊している可能性が高いので根性でデバッグするしかない。

で、根性なんぞいまどき流行らないというなら動的分析ソフトなど使ってみるといい
既に紹介があった BoundsChecker とか
Purify/PurifyPlus とか

BoundsChecker や Purify って今はおいくらするんだっけ?
まあ泥沼にはまって一向に直らない場合の人件費よりは安いだろうと思うぞ。
引用返信 編集キー/
■31686 / inTopicNo.7)  Re[3]: メモリリークについて
□投稿者/ シープラザ (2回)-(2009/01/27(Tue) 14:54:07)
みなさん

お返事ありがとうございます。
早速、上司にツールの導入を相談しました。
(ただ、ウチの会社は色々と手続きが面倒なので来週になるかと思いますが)

メモリリークじゃなくアクセス違反ですね。
すいません、色々なエラーが押し寄せてくるのでまだ混乱してます。

それにしても初心者に優しくない言語ですね(笑)
一つ一つ理解しながら成長するにはいいんでしょうけど。
アドレスまでわかってるなら変数名や中身をメッセージかなんかで教えてくれればいいのに…

.SHOさんが仰ってる
自分ならとりあえず、終了ルーチンを疑います。

ですが、下記でエラーになります。
なにか心当たりがある方いらっしゃいますでしょうか?

[場所:xtree]
iterator begin()
{
return(_TREE_ITERATOR(_LMOST()));
}

閉じる際のロジックにイテレータは意図的には使っていないのですが…
内部の処理で作成されているのでしょうか?
引用返信 編集キー/
■31687 / inTopicNo.8)  Re[4]: メモリリークについて
□投稿者/ シープラザ (3回)-(2009/01/27(Tue) 15:04:01)
書き忘れです。

呼び出し履歴を見ると、どうもWinMainCRTStartupで処理が止まっているようです。
引用返信 編集キー/
■31688 / inTopicNo.9)  Re[4]: メモリリークについて
□投稿者/ επιστημη (1583回)-(2009/01/27(Tue) 15:10:52)
επιστημη さんの Web サイト
メモリ・リークにせよアクセス違反にせよ、
トラブルの発生箇所(被害者)と原因箇所(犯人)は一般に異なります。

> アドレスまでわかってるなら変数名や中身をメッセージかなんかで教えてくれればいいのに

これは被害者の情報。犯人を知る手がかりにはなるけど犯人そのものを特定できるワケじゃない。
デバッガやツールは刑事ではありません。より高度な調査キットです。

引用返信 編集キー/
■31689 / inTopicNo.10)  Re[5]: メモリリークについて
□投稿者/ .SHO (579回)-(2009/01/27(Tue) 15:20:25)
プログラムを起動して、何もせず、すぐに終了させたら大丈夫なんでしょうか?
引用返信 編集キー/
■31690 / inTopicNo.11)  Re[6]: メモリリークについて
□投稿者/ シープラザ (4回)-(2009/01/27(Tue) 15:35:41)
高度な調査キットですか。なるほど。
高度な調査キットを使うには高度な思考を養う必要があるのかもしれませんね。
少なくとも、このサイトでご助言を下さる方達は私のような素人から見れば高度すぎて雲の上です。

.SHOさん
プログラムを起動して、何もせず、すぐに終了させたら大丈夫なんでしょうか?

いえ、立ち上げてそのまま終了しても同じエラーになります。

そしてたまたまエラー個所を発見できました。

Header.h 内の宣言***************

#include <map>

map <string, string> mObj;

(省略)
********************************
をコメントアウトするとエラー無く終了します。(もちろん処理を実行すればコンパイルエラーになりますが)

もしかしてメモリ云々ではなくヘッダーにmapを記述した事が問題なのでしょうか?
引用返信 編集キー/
■31691 / inTopicNo.12)  Re[7]: メモリリークについて
□投稿者/ επιστημη (1584回)-(2009/01/27(Tue) 15:40:43)
επιστημη さんの Web サイト
> もしかしてメモリ云々ではなくヘッダーにmapを記述した事が問題なのでしょうか?

ヘッダに定義書いちゃダメだろ常考。

つかリンク・エラーになるっしょ。
# そいつを二箇所以上で #include すれば

引用返信 編集キー/
■31692 / inTopicNo.13)  Re[7]: メモリリークについて
□投稿者/ .SHO (580回)-(2009/01/27(Tue) 15:47:20)
> をコメントアウトするとエラー無く終了します。(もちろん処理を実行すればコンパイルエラーになりますが)
> もしかしてメモリ云々ではなくヘッダーにmapを記述した事が問題なのでしょうか?

普通、ヘッダには書かないですけど、リンクエラーになってないってことは
1箇所でしかincludeしてないんですね。
ってことは、ヘッダから外に出しても結果は変わらないでしょう。
少なくとも、これでじっくり見なければいけないソースは1本に絞られたんじゃないでしょうか?
引用返信 編集キー/
■31693 / inTopicNo.14)  Re[8]: メモリリークについて
□投稿者/ επιστημη (1585回)-(2009/01/27(Tue) 15:53:18)
επιστημη さんの Web サイト
> 少なくとも、これでじっくり見なければいけないソースは1本に絞られたんじゃないでしょうか?

わからんよ。一本でしか使ってないならグローバル変数にする意味ないしぃ。
あっちこっちで 素に extern map<string,string> mObj; なんてやってたりなんかしたりして。

# つかグローバル変数は伝家の宝刀、むやみに抜くと血を見ます。


引用返信 編集キー/
■31694 / inTopicNo.15)  Re[9]: メモリリークについて
□投稿者/ .SHO (581回)-(2009/01/27(Tue) 15:56:41)
> あっちこっちで 素に extern map<string,string> mObj; なんてやってたりなんかしたりして。

まぁ、そうですね。
じゃぁ、とりあえず、extern map<string,string> mObj; がないか確認しましょう!

引用返信 編集キー/
■31695 / inTopicNo.16)  Re[9]: メモリリークについて
□投稿者/ シープラザ (5回)-(2009/01/27(Tue) 15:57:56)
あっちこっちで 素に extern map<string,string> mObj; なんてやってたりなんかしたりして。

今やってました(笑)
あるmapにしたいデータ群があり、それを作成するロジック、参照するロジック、変更するロジックが点在しています。
こういった場合、通常はグローバルを使わずにどう扱ったらよいのでしょう?
上記では省略しましたが、同じようなmap・multimap型変数が複数有り、都度引数にするのもなぁと思うのですが。
引用返信 編集キー/
■31696 / inTopicNo.17)  Re[10]: メモリリークについて
□投稿者/ επιστημη (1586回)-(2009/01/27(Tue) 16:01:45)
επιστημη さんの Web サイト
2009/01/27(Tue) 16:17:29 編集(投稿者)

> あるmapにしたいデータ群があり、それを作成するロジック、参照するロジック、変更するロジックが点在しています。

できるなら、それをまとめてクラスにせよ。もしくは点在するそれらロジックを局在化せよ。

> 上記では省略しましたが、同じようなmap・multimap型変数が複数有り、都度引数にするのもなぁと思うのですが。

その複数の変数が不可分でいつも一緒にアクセスするよなたぐいであれば、それらをまとめてクラスにせよ。
そーすることで引数が減らせる。

グローバル変数はどっからでもいぢれるから強力です。
が、どっからでもいぢれるから簡単に悪事を働きます。
伝家の宝刀は時として主に牙を剥くのです。

引用返信 編集キー/
■31697 / inTopicNo.18)  Re[8]: メモリリークについて
□投稿者/ 出水 (111回)-(2009/01/27(Tue) 16:05:00)
なんとなく、開放済みポインタへのアクセスの予感
下位にあるローカル変数のアドレスをいつまでも持っているとか…

まずは、デバッガでステップ実行して、どの変数が壊されているのかの特定ですね
どこでとまっているか、ではなく、どの変数が悪さをしているのか、です

あとは、アドレス0xcccccccc, 0xcdcdcdcd, 0xddddddddのいずれかであれば、
どういう理由で破壊されたかぐらいの手がかりにはなります
引用返信 編集キー/
■31698 / inTopicNo.19)  Re[10]: メモリリークについて
□投稿者/ .SHO (582回)-(2009/01/27(Tue) 16:15:20)
だいたいやるべきことはわかったんじゃないでしょうか?
あとは頑張るだけです^^;

引用返信 編集キー/
■31699 / inTopicNo.20)  Re[11]: メモリリークについて
 
□投稿者/ オショウ (83回)-(2009/01/27(Tue) 16:34:17)
余談ながら・・・

BoundChecker等、体験版ダウンロードできるはず。
機能的制限はなし。使用日数制限だったと思います。(1週間くらいだったか・・・)

その間に集中デバッグしたら〜

以上。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -