プロが教えるわが家の防犯対策術!

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

例にプログラムの実行中に top コマンドでメモリの
使用状況を見てみると,実行プログラムのメモリ使用
量が,最初 0.5 % ぐらいだったものが,時間が経つに
つれ増加していき,気づいたら 50 % あたりを前後
している状態になっていました...

これはやはりメモリの開放に失敗しているからなんで
しょうか?

ちなみに,使用言語はC++です.計算機環境は
linux red hat です.

main() から plan() という関数を呼び,そこで
for文をずーっと回してる感じになっています.
ちなみに,このfor文の中で,動的にメモリを確保して
います(new).なお,これが原因か?と思い,for 文
を break するところで,delete をやってみたのです
が,プログラム実行中に何故だかセグメンテーション
フォルトで落ちてしまいました...
これの変わりとしてはやはりfree() を使うしかないん
でしょうか?

どたなか,この"強制終了"の原因が分かる方,ある
いは,原因らしきものが分かる方,対処法をお教え
願えないでしょうか?

もし,必要な情報がありましたら聞いてください.
こちらから返事いたします.

よろしくお願いいたします.

A 回答 (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等のバージョンを調べ
そのバージョンにバグが無いかも調べてください。
    • good
    • 1

もしかしたらdeleteの位置が悪くて,deleteする前に何度もnewで確保し続ける状態になっていませんか?



plan()
{
int *a=NULL, data;
data = 100;
for(){
a = new int[data];
 
delete [] a;
a = NULL;
 }
}
としてみては?
    • good
    • 0

どこか意図しないところでメモリを破壊しているのでしょう。


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

参考URL:http://dengaku.org/naoki/comp/old-documents/TA/p …

この回答への補足

ありがとうございます.
参考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

補足日時:2005/02/25 13:15
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています