• 締切済み

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

大学の研究で,あるプランナを開発してみました. プランニングにはおよそ数日を要してしまうのですが, なぜか毎日大学にやってくると前日のプログラムが強制 終了してしまっています... 各ソースファイルでは全てデストラクタを書いているの ですが... 例にプログラムの実行中に 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