• ベストアンサー

【VC++6.0(MFC)】「Out of memory」の対処の仕方を教えてください。

いつも大変お世話になっております。 VC++初心者です。 現在、VC++6.0(MFC)のソース修正を行っております。 そのソースを長時間実行させると、メッセージボックスで タイトル:ソフト名 メッセージ:Out of memory と出てきて悩んでいます。 (コンパイル、ビルドは成功しています。) (そのソフトを立ち上げなおすと、しばらくの間は正常に動作します。) 大変お手数ですが、 この問題を対処する手順や怪しいと思われる箇所を 経験則でも宜しいので教えて頂けませんでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.3

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

yuki7091
質問者

お礼

ご回答、ありがとうございます。 やはり、メモリリークですか、、、 メモリリークの対処はとても厄介、と噂で聞いていたので、 今まで私自身、newしたら必ずdelete、おまじないのように コーディングしていました。 しかし、先人の残したソースでこの問題が、とうとう 身に降りかかってきているので、修正できるかかなり心配です。 また、チェックする項目を教えていただき、ありがとうございます。 現状では、ここまで調べられました。 >・newしたオブジェクトをきちんとdeleteしているか? newしている箇所は3つ、いずれもスレッドをつくっているようです。 deleteはしていなさそうです。 >・オブジェクトのポインタを保持する変数に上書きでnewしてないか? すみません、これはどういうことなのでしょうか。 >・ヒープメモリの確保と開放(mallocとfree)は正しく行っているか? malloc、freeを使用している箇所はございませんでした。 >・関数を呼ぶたびに生成されるオブジェクトを放置してたりしないか? 「オブジェクトを放置」ということは、「newしたら必ずdelete」と いう認識で宜しいでしょうか。 また、調査が進められ次第ご連絡します。

その他の回答 (3)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

直接の原因としてはnewに失敗しているんでしょう。 newの失敗の原因としては、deleteのし忘れの他、管理領域を壊してしまって、まだメモリがあるのに、newできなくなってしまっていることが考えられますね。 経験則でいうと、調べるのはかなり大変だと思いますが、地味にやるしかないですね。

yuki7091
質問者

お礼

ご回答、ありがとうございます。 噂には聞いておりましたが、かなり大変なのですね。 ちなみに、 >管理領域を壊してしまって、まだメモリがあるのに、 >newできなくなってしまっていること とは、どういうことなのでしょうか。 管理領域とそうでない領域を調べる方法というものがあるのでしょうか。 (レベルが低くてすみません。) 宜しければ、再度ご教授頂きたくお願いします。

yuki7091
質問者

補足

一度、この質問を閉じさせていただきます。 対応していただき、ありがとうございました。

  • mokekyo
  • ベストアンサー率18% (2/11)
回答No.2

単純にアクセスしちゃいけないところにアクセスしているん でしょうから、ループしている中の変数とか加算してる 変数とかをおっていけばいいんじゃないでしょうか。 後、質問者さんが修正する前にはそのエラーはありましたか? もし、なかったのなら、あなたの修正した部分が怪しいです。 修正前のソースと見比べてみてはいかがでしょうか。

yuki7091
質問者

お礼

ご回答、ありがとうございます。 >単純にアクセスしちゃいけないところにアクセスしているん >でしょうから、ループしている中の変数とか加算してる >変数とかをおっていけばいいんじゃないでしょうか。 「アクセスしちゃいけないところにアクセスしている」とは、 例えばどういうことなのでしょうか。 (レベルが低くてすみません。) また、「変数とかをおっていけばいいんじゃない」とは、 デバグモードで追っていきますよね。 私は「デバグモードで追う」という事が、他の人が書いたソースだと うまく出来ません。 (自分の書いたソースですと怪しい箇所とかが、予測つけられるのですが、、、) 何か追う為のコツというものはありますか。 >後、質問者さんが修正する前にはそのエラーはありましたか? いいえ、私の修正前のソースでエラーが発生しました。 自分で書いたソースならある程度、エラー発生箇所の予想が 立てられるですが、 先人が書いたソースのため、全く予想ができていないのが現状です。

回答No.1

■メモリリーク  デバックモードで起動して、OutOFMemoryが出る前に終了。  メモリリークしていないか調べる。  メモリリークを調べる方法は、ご自分で調べて下さい。  (この程度をできないことでは無理) 記述に関して MFCということですが、例外処理は正しく記述できていますか? MFCの場合の例外処理は決まりがあったと思います。 MSDNで調べてみましょう。 >この問題を対処する手順や怪しいと思われる箇所 ソースコードもないのに具体的に箇所を指摘できません。 どういった処理をしているのかすら不明なのですから。

yuki7091
質問者

お礼

ご回答、ありがとうございます。 >メモリリークしていないか調べる。 >メモリリークを調べる方法は、ご自分で調べて下さい。 >(この程度をできないことでは無理) メモリリークを疑うところはnewしたものがdeleteされているか、 という事と認識しています。 (この認識が合っているか、あまり自信ないです。) >MFCということですが、例外処理は正しく記述できていますか? 例外処理はされていなさそうです。 >>この問題を対処する手順や怪しいと思われる箇所 >ソースコードもないのに具体的に箇所を指摘できません。 おっしゃるとおりです。 先人が残していったソースを修正しており、そのソースを 読み解くだけでも相当な時間がかかってしまいそうなので、 このような質問をさせて頂きました。

関連するQ&A

  • コンパイル時に「out of memory」とでます。

    C言語でソースを書いてコンパイルすると「rpg.c 13: out of memory」と表示されてコンパイルできません。どうしたらいいのでしょうか。

  • Out of Memory at line:17

    accessからハイパーリンクを開いたらメッセージボックスが出て 「Out of Memory at line:17」 と書かれていました。 OKボタンしかないです。 これってなんでしょう? OSはXPで、IE6、アクセス2003です。

  • Out of memory?

    JavaScriptでちょっとしたプログラムを書いているのですが、HTMLに組み込んでビルド(実行)してみると、「Out of memory at line:384」というエラーが出てしまいました。 因みに384行目には、変数に空白を代入するプログラム(?)が書いてありました。 変数が多すぎるのですかね?384行目までに出てくるのは40個程度で、全体でも50個程度なのですが。 多分、メモリが足らないと言っているのだと思うのですが、原因が分からないのでどうやったら改善できるのか分かりません。 分かる方おられたら、よろしくお願いします。

  • out of memory at line:31と出てきて固まります。

    out of memory at line:31と出てきて固まります。 一昨日まで出てなかったのに昨日から突然インターネットをしているとout of memory at line:31というのが小窓で出てきてokを押してもまた出てきます。 その小窓が出るともうどうしようもないのでctrl+alt+deleteで終了させないといけません。 見てるサイトはmixiだったりface bookだったり普通にネットをしていて突然出てます。 IE8 WINDOWS XP プロフェッショナル サービスパック3 です。 1.6GHz 1.99GBです。 少し調べてみて常時ソフトだったりデスクトップのアイコンを削除したりディスクのクリーンアップをしてみたりしました。 ネットで少しout of memory at line:31をしらべても『31』という表示のものがありませんでしたのでトピを立てさせてください。 よろしくお願いします<(_ _)>

  • out of memory at line: 45

    一週間ほどまえから、Googleで検索しようと入力すると 「Web ページからのメッセージ」として out of memory at line:45(あるいは458) というエラーが出て、OKをクリックしても数回出て、不愉快です。 その後は入力できますが、新たに入力するとまた出ます。 特に新しいソフトをインストールしてはいません。 Windows Vista,IE8です。 Yahooでの検索では出ないようです。 

  • out of memory at line;56メッセージ対策について

    Windows Internet Explorer out of memory at line;56 のメッセージに対する対策をご指導ください。 よろしくお願いいたします。

  • VC6(MFC)でのシンプルなMakefileについて

     VC6のコンソールアプリケーションで、CStdioFileクラスを使った単純なサンプルソースを作りました。  コンソールアプリケーションなのでIDEのプロジェクトは大げさな気がしたので、makefileをエクスポートして不要と思われる箇所を試行錯誤しながら削除しました。  現在、下記のオプションまで簡素化したのですが、まだまだ削れそうです。 MFCのコンソールアプリケーションをビルドするには、最小限どのようなオプションが必要なのでしょうか。 #コンパイルオプション CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Fp"$(INTDIR)\$(TARGET).pch" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c RSC_PROJ=/l 0x411 /d "NDEBUG" /d "_AFXDLL" #リンクオプション LINK32_FLAGS=/nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\$(TARGET).pdb" /machine:I386 /out:"$(OUTDIR)\$(TARGET).exe" 以上、よろしくお願いします。

  • サイトを閲覧していたらout of memory at line:28

    サイトを閲覧していたらout of memory at line:28というエラーメッセージのがいきなり出てきてOK押しても×を押しても消えません。 こんな事は初めてなのですが…。 このエラーメッセージを出したまま再起動やシャットダウンしてしまっても大丈夫でしょうか…? 他の質問者の方のも見たのですが、消す方法だけがどうもよく解らなくて…。 このエラーメッセージを消す方法を知ってる方、出来るだけ詳しく教えて下さると嬉しいです…。

  • リビルド後に実行しようとするとビルド要求のメッセージが出る

    VC++6.0のMFCを使って開発しているアプリケーションがあります。そのアプリケーションをビルドする際に起きる問題についてです。 リビルドした後に実行ファイルを実行しようとすると「ビルドしますか?」というメッセージが出てきます。リビルドしたばかりなのに何故ビルドが必要なのかわかりません。それから、再ビルド時には全ソースファイルがコンパイルされているようですので、実行されるまで時間がかかってしまいます。 リビルドしたときにはコンパイルエラーや警告はありませんし、リビルド後には確かに実行ファイルは生成されています。「ビルドしますか?」のメッセージが出ても「はい」ボタンをクリックしてビルドが完了すれば実行ファイルが実行されます。この問題は開発当初からあった問題ではなく、あるときから突然起きた問題です。いつから起きた問題なのかはわかりません。ちなみに、この問題は「バッチビルド」を使って複数のコンフィグレーションをリビルドした時に起きるようです。1つのコンフィグレーション(実行したいコンフィグレーション)のみをリビルドした後にはこの問題は起きません。また、リリース版、デバッグ版ともにこの問題は起きます。 下記はメッセージの内容です。(英語版のVCなのでメッセージは英語です。) (xxxは実行ファイル名、aaa、bbb、cccはソースファイル名) ---------------------------------------------------- One or more files are out of date or do not exist. These files need to be build: .\Debug\xxx.bsc .\Debug\xxx.exe .\Debug\aaa.obj .\Debug\bbb.obj .\Debug\ccc.obj <more file ...> Would you like to build them? ---------------------------------------------------- 原因や解決方法をご存知の方、ご教授をお願い致します。 環境:Win2000(日本語版)、VC++6.0(英語版)、MFC

  • VC++のビルドとリビルドの違い

    VC(マイクロソフトのVisual C++)で、ソースをコンパイルするときにビルドを押すと思うのですが、ビルドの隣にリビルドがあります。このビルドとリビルドの違いはなんなのでしょうか?? こんなときは「ビルド」でこんなときは「リビルド」のような具体的な事例もできれば教えて頂ければ幸いです。

専門家に質問してみよう