• 締切済み

プログラムが途中で強制終了してしまいます...

大学の研究で,あるプランナを開発してみました. プランニングにはおよそ数日を要してしまうのですが, なぜか毎日大学にやってくると前日のプログラムが強制 終了してしまっています... 各ソースファイルでは全てデストラクタを書いているの ですが... 例にプログラムの実行中に top コマンドでメモリの 使用状況を見てみると,実行プログラムのメモリ使用 量が,最初 0.5 % ぐらいだったものが,時間が経つに つれ増加していき,気づいたら 50 % あたりを前後 している状態になっていました... これはやはりメモリの開放に失敗しているからなんで しょうか? ちなみに,使用言語はC++です.計算機環境は linux red hat です. main() から plan() という関数を呼び,そこで for文をずーっと回してる感じになっています. ちなみに,このfor文の中で,動的にメモリを確保して います(new).なお,これが原因か?と思い,for 文 を break するところで,delete をやってみたのです が,プログラム実行中に何故だかセグメンテーション フォルトで落ちてしまいました... これの変わりとしてはやはりfree() を使うしかないん でしょうか? どたなか,この"強制終了"の原因が分かる方,ある いは,原因らしきものが分かる方,対処法をお教え 願えないでしょうか? もし,必要な情報がありましたら聞いてください. こちらから返事いたします. よろしくお願いいたします.

みんなの回答

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

#8 0x08053e36 in createZonesForDynamicZoning (this=0x4000b220) at ASEnvironment.cpp:581 #9 0x0805abc4 in ASEnvironment::ASEnvironment(double, int) () at ASEnvironment.cpp:18 #10 0x08052780 in ASSimulater::ASSimulater(int, int, int, double, int, int, int, int, int, int, int, int) () at ASSimulater.cpp:12 #11 0x0804b0b7 in plan () at ASMain.cpp:80 #12 0x0804c43c in main (argc=1, argv=0xbffffb14) at ASMain.cpp:184 #13 0x42017499 in __libc_start_main () from /lib/i686/libc.so.6 とりあえず ASEnvironment.cppの581行目 ASEnvironment.cppの18行目 ASSimulater.cppの12行目 ASMain.cppの80行目 辺りを調べてみる。 >これはやはりメモリの開放に失敗しているからなんで >しょうか? 失敗しているのではなくメモリを開放していないからでしょう。 newしたものは自動では開放してくれません。自分でdeleteしなければメモリを食いつぶしていきます。 不要になったものをちゃんとdeleteしてますか? とりあえずint型初期値0のグローバル変数をつくり newするところで+1 deleteするところで-1してみて プログラム終了時(強制終了ではなく)に0になるか試してください。 >動的にメモリを確保して >います(new).なお,これが原因か?と思い,for 文 >を break するところで,delete をやってみたのです newしとものをいきなりdeleteすれば その後newしたポインタを参照しようとした関数なりで Segmentation Faultが起こるのは当然の事。freeにしても同じ結果です。 (既に開放されている為) この手のエラーの解決先は根気です。ひたすらソースを追ってください。 それでも分からないならLinuxとカーネル、gcc、libc等のバージョンを調べ そのバージョンにバグが無いかも調べてください。

  • sismoon
  • ベストアンサー率22% (22/97)
回答No.2

もしかしたらdeleteの位置が悪くて,deleteする前に何度もnewで確保し続ける状態になっていませんか? plan() { int *a=NULL, data; data = 100; for(){ a = new int[data];   delete [] a; a = NULL;  } } としてみては?

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

どこか意図しないところでメモリを破壊しているのでしょう。 無効なポインタを指している可能性が高いです。 deleteした後にそのポインタを指しているとか、 ポインタや配列の添え字をインクリメントとかしているなら その辺りも調べてください。

参考URL:
http://dengaku.org/naoki/comp/old-documents/TA/prog1-2001/segmentation.html
starground
質問者

補足

ありがとうございます. 参考URLに書いてある通りにデバッグを行ってみたら以下のようなことが分かりました.が,これからどうやったらいいのか分かりません...どうしたらいいのでしょうか? (gdb) where #0 0x4207a93e in chunk_alloc () from /lib/i686/libc.so.6 #1 0x4207a058 in malloc () from /lib/i686/libc.so.6 #2 0x4028361e in operator new(unsigned) () from /opt/intel/compiler70/ia32/lib/libcxa.so.3 #3 0x08066fe4 in std::_Allocate (_Count=4) at xmemory:29 #4 0x0805d79a in allocate (this=0x8134050, _Count=4) at xmemory:137 #5 0x0805d7c1 in allocate (this=0x8134050, _Count=4) at xmemory:142 #6 0x0805e244 in _Insert_n (this=0x8134050, _Where=0x8134068, _Count=1, _Val=@0xbffff26c) at vector:581 #7 0x0805df37 in insert (this=0x8134050, _Where=0x8134068, _Val=@0xbffff26c) at vector:373 #8 0x08053e36 in createZonesForDynamicZoning (this=0x4000b220) at ASEnvironment.cpp:581 #9 0x0805abc4 in ASEnvironment::ASEnvironment(double, int) () at ASEnvironment.cpp:18 #10 0x08052780 in ASSimulater::ASSimulater(int, int, int, double, int, int, int, int, int, int, int, int) () at ASSimulater.cpp:12 #11 0x0804b0b7 in plan () at ASMain.cpp:80 #12 0x0804c43c in main (argc=1, argv=0xbffffb14) at ASMain.cpp:184 #13 0x42017499 in __libc_start_main () from /lib/i686/libc.so.6

関連するQ&A

  • プログラム実行中に強制終了

    現在、VC++6.0でDLLを作成し、それを用いてVBで図形を描画をするプログラムを作っています。 実行中に連続して図形を描画すると強制終了になります。VBのみで図形を書いたりした場合はこのようなことは起こったことがないのでVCで作ったDLLが問題じゃないのかなと予想しています。 強制するときの状況ですが、 "0x69634e8c"の命令が"0x0000003c"のメモリを参照しました。メモリが"written"になることは出来ませんでした。 というメッセージが表示され、次に "0x5c8faed8"の命令が"0x00000564"のメモリを参照しました。メモリが"read"になることは出来ませんでした。 というメッセージが表示され強制終了されます。 またタスクマネージャで強制終了する際の様子を見ていると、PF使用量が1.2GBと異常に高い値になっていました。 どなたかこの問題に対して意見を下さいませんか?

  • word2000が途中で強制終了されてしまいます;;

    Word2000で文章を作成中に突然「0x77fcd79aの命令が0x00000000のメモリを参照しましたメモリがwrittenになることはできませんでした。」と表示されてプログラムが強制終了されてしまいます。どうしたら解決できるでしょうか?

  • VB6から他のプログラムを強制終了したい

    こんにちは、ただいま、VB6からあるプログラムを強制終了したいのプログラムを作りだいです。 強制終了したいのプログラムがVBのプログラムから起動じゃなくで、VBのプログラム実行する前に起動したのプログラムです。 API関数 TerminateProcess(hProcessHandle, 0&) を使いたいですが、現存のプロセスのProcessHandleを取得できません。 困ってる。 お手数ですが、解決方法が有れば教えてください

  • MS-DOSが強制終了

    MS DOSを使用するプログラムを立ち上げると毎回 強制終了されてしまいます。 仕事に必要なプログラムで大変困っています。 表示は以下の通りです 『このプログラムは不正な処理を行った為強制終了します。すべてのプログラムを終了して再起動してください』 『プログラムあ無効な操作を実行しました』 エラーが起きたアドレス:037C:00E4 サービスの割り込み 無し 一旦このプログラム自体をアンインストールして入れ直そうとしてみましたが、やはりMS DOSのところで同様に表示されるので直すべきところはMS DOS ですよね?

  • malloc呼び出し時のセグメンテーションフォルト

    UNIX(HP-UX)上でCプログラムを組んでおります。 その際、mallocでセグメンテーションフォルトが起こりました。 mallocでセグメンテーションフォルトが起こった場合、どのように調査するのか、また実際どのような原因で起こりうるのか教えていただけますでしょうか?

  • ウイルスバスター2008 検索中に強制終了する原因は?

    ウイルスバスター2008で検索中 「実行中の検索は、強制終了されました。プログラムを再起動してから検索を再度実行してください。解決しない場合は、コンピュータを再起動してください。」 という画面が表示され検索が強制終了してしまいます。 使用のノートPCは NEC PC-LC5003D OS Windows XP Home Edition SP3 CPU Pentium4 1.40GHz メモリ 256MB ですのでメモリが動作条件を満たしておりませんが、 SP2までは問題なく検索が終了していました。 SP3にしてからは必ず上記画面が表示され一度も正常に終了したことがありません。 アンインストールし再インストールしましたが効果がありませんでした。 スキャンディスク、セーフモードで再起動等も行いました。 強制終了の原因はメモリ不足なのでしょうか?SP3にしたせいなのでしょうか? 両方なのでしょうか? 動作条件を満たしていてもSP3にしたら強制終了するようになった方や、 メモリを増設したら解決した方がいらっしゃいましたら教えてください。

  • IE7が強制終了してしまいます

    IE7を使用していますが、サイト「Google]に接続した途端にSysFader:RE.EXEアプリケーションエラーとなり、Googleのサイトに接続できません。エラーの文面は"0×80000093"の命令が"0×80000093"のメモリを参照しましたが、メモリが"read"になる事はできませんでした、プログラムを終了するには[OK]をクリックして下さい。と出て、OKをクリックするとIE7が強制終了してしまいます。他のブラウザ「Opera」ではこの様な症状は出ず接続できます。何が原因でこの様になるのかどなたか教えて頂けないでしょうか、お願いします。

  • Premiereで強制終了

    AdobeのPremiere(体験版ですが・・・)をインストール して使用しようとしたのですが、少し操作をすると すぐに強制終了してしまいます。これは、メモリが 足りないのが原因でしょうか? ちなみにマシンは、PenIIIの800、メモリ256、WinXPです。

  • プログラムの強制終了

    知人のパソコンが、 文字を入力し変換した際に、 使用したい漢字が一回目に出てきて、 そのまま決定する分には問題ないそうなのですが、 漢字を選択した場合、決定するとエラーになり、 プログラムが強制終了になってしまうそうです。 この状態を直す方法を教えて下さい。

  • バッチファイルでプログラムを強制終了って・・・

    実行中のプログラムを強制終了させてしまうバッチファイルって 果たして作ることが可能なものでしょうか? アドバイスよろしくお願い致します。 対象環境はNT4サーバです。 やりたいことのイメージとしては、例えば、メモ帳でテキストを書き、そして 未保存状態で動かしっぱなしのところを、バッチで強制終了させてしまう、 そんな感じです。当然未保存云々と聞かれますけれども保存せずに強制終了!です。 (もしくは、タスクマネージャを起動し、そのアプリケーションタスクを 終了させる、と表現したほうが良いのでしょうか) ・・・果たしてそんなことってできるのでしょうか? とくにネットワークの処理は考え無く、単にそのNTマシン自身の話なのです。 よろしくお願いします。

専門家に質問してみよう