アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつも大変お世話になっております。
VC++初心者です。

現在、VC++6.0(MFC)のソース修正を行っております。
そのソースを長時間実行させると、メッセージボックスで
タイトル:ソフト名
メッセージ:Out of memory
と出てきて悩んでいます。
(コンパイル、ビルドは成功しています。)
(そのソフトを立ち上げなおすと、しばらくの間は正常に動作します。)

大変お手数ですが、
この問題を対処する手順や怪しいと思われる箇所を
経験則でも宜しいので教えて頂けませんでしょうか。

A 回答 (4件)

ほぼ間違い無く「メモリリーク」でしょうね。



・newしたオブジェクトをきちんとdeleteしているか?
・オブジェクトのポインタを保持する変数に上書きでnewしてないか?
・ヒープメモリの確保と開放(mallocとfree)は正しく行っているか?
・関数を呼ぶたびに生成されるオブジェクトを放置してたりしないか?

などをチェックしましょう。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

やはり、メモリリークですか、、、
メモリリークの対処はとても厄介、と噂で聞いていたので、
今まで私自身、newしたら必ずdelete、おまじないのように
コーディングしていました。
しかし、先人の残したソースでこの問題が、とうとう
身に降りかかってきているので、修正できるかかなり心配です。

また、チェックする項目を教えていただき、ありがとうございます。
現状では、ここまで調べられました。
>・newしたオブジェクトをきちんとdeleteしているか?
newしている箇所は3つ、いずれもスレッドをつくっているようです。
deleteはしていなさそうです。

>・オブジェクトのポインタを保持する変数に上書きでnewしてないか?
すみません、これはどういうことなのでしょうか。

>・ヒープメモリの確保と開放(mallocとfree)は正しく行っているか?
malloc、freeを使用している箇所はございませんでした。

>・関数を呼ぶたびに生成されるオブジェクトを放置してたりしないか?
「オブジェクトを放置」ということは、「newしたら必ずdelete」と
いう認識で宜しいでしょうか。

また、調査が進められ次第ご連絡します。

お礼日時:2009/08/17 03:22

直接の原因としてはnewに失敗しているんでしょう。



newの失敗の原因としては、deleteのし忘れの他、管理領域を壊してしまって、まだメモリがあるのに、newできなくなってしまっていることが考えられますね。

経験則でいうと、調べるのはかなり大変だと思いますが、地味にやるしかないですね。

この回答への補足

一度、この質問を閉じさせていただきます。

対応していただき、ありがとうございました。

補足日時:2009/08/27 11:54
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

噂には聞いておりましたが、かなり大変なのですね。

ちなみに、
>管理領域を壊してしまって、まだメモリがあるのに、
>newできなくなってしまっていること
とは、どういうことなのでしょうか。
管理領域とそうでない領域を調べる方法というものがあるのでしょうか。
(レベルが低くてすみません。)

宜しければ、再度ご教授頂きたくお願いします。

お礼日時:2009/08/17 03:34

単純にアクセスしちゃいけないところにアクセスしているん


でしょうから、ループしている中の変数とか加算してる
変数とかをおっていけばいいんじゃないでしょうか。

後、質問者さんが修正する前にはそのエラーはありましたか?
もし、なかったのなら、あなたの修正した部分が怪しいです。
修正前のソースと見比べてみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

>単純にアクセスしちゃいけないところにアクセスしているん
>でしょうから、ループしている中の変数とか加算してる
>変数とかをおっていけばいいんじゃないでしょうか。
「アクセスしちゃいけないところにアクセスしている」とは、
例えばどういうことなのでしょうか。
(レベルが低くてすみません。)
また、「変数とかをおっていけばいいんじゃない」とは、
デバグモードで追っていきますよね。
私は「デバグモードで追う」という事が、他の人が書いたソースだと
うまく出来ません。
(自分の書いたソースですと怪しい箇所とかが、予測つけられるのですが、、、)
何か追う為のコツというものはありますか。

>後、質問者さんが修正する前にはそのエラーはありましたか?
いいえ、私の修正前のソースでエラーが発生しました。
自分で書いたソースならある程度、エラー発生箇所の予想が
立てられるですが、
先人が書いたソースのため、全く予想ができていないのが現状です。

お礼日時:2009/08/17 02:52

■メモリリーク


 デバックモードで起動して、OutOFMemoryが出る前に終了。
 メモリリークしていないか調べる。
 メモリリークを調べる方法は、ご自分で調べて下さい。
 (この程度をできないことでは無理)

記述に関して
MFCということですが、例外処理は正しく記述できていますか?
MFCの場合の例外処理は決まりがあったと思います。
MSDNで調べてみましょう。

>この問題を対処する手順や怪しいと思われる箇所
ソースコードもないのに具体的に箇所を指摘できません。
どういった処理をしているのかすら不明なのですから。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

>メモリリークしていないか調べる。
>メモリリークを調べる方法は、ご自分で調べて下さい。
>(この程度をできないことでは無理)
メモリリークを疑うところはnewしたものがdeleteされているか、
という事と認識しています。
(この認識が合っているか、あまり自信ないです。)

>MFCということですが、例外処理は正しく記述できていますか?
例外処理はされていなさそうです。

>>この問題を対処する手順や怪しいと思われる箇所
>ソースコードもないのに具体的に箇所を指摘できません。
おっしゃるとおりです。
先人が残していったソースを修正しており、そのソースを
読み解くだけでも相当な時間がかかってしまいそうなので、
このような質問をさせて頂きました。

お礼日時:2009/08/17 02:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!