大学の研究で,あるプランナを開発してみました.
プランニングにはおよそ数日を要してしまうのですが,
なぜか毎日大学にやってくると前日のプログラムが強制
終了してしまっています...
各ソースファイルでは全てデストラクタを書いているの
ですが...
例にプログラムの実行中に top コマンドでメモリの
使用状況を見てみると,実行プログラムのメモリ使用
量が,最初 0.5 % ぐらいだったものが,時間が経つに
つれ増加していき,気づいたら 50 % あたりを前後
している状態になっていました...
これはやはりメモリの開放に失敗しているからなんで
しょうか?
ちなみに,使用言語はC++です.計算機環境は
linux red hat です.
main() から plan() という関数を呼び,そこで
for文をずーっと回してる感じになっています.
ちなみに,このfor文の中で,動的にメモリを確保して
います(new).なお,これが原因か?と思い,for 文
を break するところで,delete をやってみたのです
が,プログラム実行中に何故だかセグメンテーション
フォルトで落ちてしまいました...
これの変わりとしてはやはりfree() を使うしかないん
でしょうか?
どたなか,この"強制終了"の原因が分かる方,ある
いは,原因らしきものが分かる方,対処法をお教え
願えないでしょうか?
もし,必要な情報がありましたら聞いてください.
こちらから返事いたします.
よろしくお願いいたします.
A 回答 (3件)
- 最新から表示
- 回答順に表示
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等のバージョンを調べ
そのバージョンにバグが無いかも調べてください。
No.2
- 回答日時:
もしかしたらdeleteの位置が悪くて,deleteする前に何度もnewで確保し続ける状態になっていませんか?
plan()
{
int *a=NULL, data;
data = 100;
for(){
a = new int[data];
delete [] a;
a = NULL;
}
}
としてみては?
No.1
- 回答日時:
どこか意図しないところでメモリを破壊しているのでしょう。
無効なポインタを指している可能性が高いです。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- ノートパソコン Windows 10 動作改善方法 6 2023/04/26 22:30
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Windows 7 Media Playerが開かない。ファイルアイコンを右クリックしても「プロパティ」が表示されない。 2 2023/02/05 14:45
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Windows 10 このWindowsUpdateの失敗メッセージは何を物語るか? 5 2023/07/17 11:49
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- Outlook(アウトルック) outlook メモリ不足 1 2022/05/31 10:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
newしないオブジェクトについて
-
win32APIのHeapAlloc()の使い方...
-
c言語のポインタへの文字列入力...
-
プログラムが途中で強制終了し...
-
構造体でchar name[]と*nameの...
-
C++のnewで確保したメモリーの...
-
配列の添え字の最大数とは?
-
void*型のデータサイズ
-
アンマネージド関数でのメモリ...
-
指定したメモリアドレスの値の...
-
ヒープメモリの解放について
-
画像を読み込む配列の確保。
-
C++で、メンバもヒープに確保さ...
-
入れ子になった構造体について
-
malloc呼び出し時のセグメンテ...
-
new、memset()、エラー
-
C++ Vectorのデストラクタ
-
GDI+におけるメモリの開放について
-
Accessで、メモリを開放するタ...
-
64ビットと32ビットの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
mallocについて
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
指定したメモリアドレスの値の...
-
スタック破壊の上手な見つけ方...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
free関数で動作が止まる
-
callocの処理速度
-
MSDNがgethostbynameではなくge...
-
C++のnewで確保したメモリーの...
-
sprintf()の使い方について
-
Accessで、メモリを開放するタ...
おすすめ情報