私は今まで,"BorlandC++5.5.1"を使用してコマンドラインで実行していたのですが,あるプログラムが実行時に問題が発生->処理中断となる.
原因不明のエラーが出ました.
メモリ関係の問題と考え,手をつくしたのですがうまくいかず友人のg++でコンパイル->実行すると"free() invalid pointer"と出ました.
もう,にっちもさっちもいかないので試しに"Visual C++2008 体験版"でビルド->実行すると動きました.
一応ちゃんと動いているようなのですが,なぜかわからず気持ち悪いのです….
最適化の差なのでしょうか?
どなたかお答いただけませんか?
ちなみに,質問板の利用は初めてです.長文失礼しました.
No.6ベストアンサー
- 回答日時:
>すいません…
>3と4の意味が少し分かりません.
>よろしければ参考になるURL,書籍などを教えていただけませんか?
3.に関してはBorlandC++5.5.1を使ったことが無いのでコンパイルオプションが不明なのですが、コンパイラによってはデバッグビルド時に配列の添え字が上限と下限を超えてないか自動チェックしてくれるコード埋め込んでくれるものが存在します。無い場合は、自分で配列操作時に添え字をチェックするプログラムを埋め込みます。関数やマクロにすると楽だと思います。
4.はTurbo Debugger5.5でブレークポイントを使います。データの変化でブレークできると思いますので確認してみてください。
>代入をする部分でなく,代入をする関数を呼んだ瞬間に問題が発生します.
代入する関数でallocやfreeを使っているんでしょうか?もし違ったら、そう見えるだけかもしれません。それとvectorクラスの参照時に添え字が範囲オーバーしていないか確認してみてください。
ともかく仕事でプログラムをやっていると他の人の作ったとんでもないバグに遭遇することがあります。特にスレッド等が絡むと厄介ですね。他の人の作ったバグを一週間ぐらい追いかけて直したことがあります。それよりは楽だと思いますので諦めず地道にやりましょう。
Turbo Debugger5.5.初めて使いました.
情けないことにブレークの仕方がわからなかったので
とりあえずRUNさせてみましたところ,
Stopped on exception trhow
と表記され,例外処理してるらしいところ
を教えてくれました.
void Vector::cleanup()という微小要素を0にする関数内の
vectorの要素の絶対値が0より大きいか判定する
if文の手前で止まってるらしいです.
デバッガについて調べつつ,地道に急いでやってみます.
何度も有難うございます.
No.7
- 回答日時:
>Turbo Debugger5.5.初めて使いました.
これを使うくらいならTurboC++かVC++EEを使ったほうが効率は良いですよ。
http://www.asahi-net.or.jp/~qb3k-kwsk/rpg/progra …
>これを使うくらいならTurboC++かVC++EEを使ったほうが効率は良いですよ。
あ~確かにそっちの方が楽そうです。
ちょっと考えます。
処理の流れや変数の値を見ていった結果
何となくわかってきましたので、怪しい範囲の数値計算
をおってみます。
最初は訳がわからなかったですが、
皆さんのおかげで、だいぶ分かってきました。
本当にありがとうございます。
No.5
- 回答日時:
その症状は「確実にメモリを破壊」しています。
Visual C++2008 体験版で「問題なく動いている」理由は「Visual C++2008 体験版でコンパイルした場合、破壊されるメモリ領域が、他に何の影響も及ぼさない、未使用メモリ領域だから」でしょう。
なので「ちょっとプログラムを変えただけ」で「破壊されるメモリ領域の場所が変わってしまい、Visual C++2008 体験版でコンパイルしても駄目になってしまう」でしょう。
で、誰がメモリを壊しているか調べる為に「どこまで実行できたか」のデバッグ用のprintf表示などを挿入すると、壊れるメモリの位置が変わって異常終了が発生しなくなり、ちゃんと動いてしまったりする。
ちゃんと動いてしまったので、もう大丈夫かと思い、デバッグ用のprintf表示などを削ると、壊れるメモリの位置がまた変わってしまい、異常終了が再発生するようになってしまったりする。
そんな訳で「誰が悪さをしているか?」は、追いかけるのが非常に大変ですが「悪さをしている奴が居るのは確実」なので、頑張って駆逐して下さい。
なるほど…
自分は大学の研究でプログラムを書いているのですが,
あまりメモリのことまで考えていませんでした.
今回初めて,自分で一から少し大きいプログラムを書き出した
もので,プログラムのデリケートさを始めて実感しました.
締め切りも近いですが,「悪さしている奴を追いかけます」.
回答有り難う御座いました.
No.4
- 回答日時:
こんにちは。
>free() invalid pointer
既出のとおり、どこかの変数を操作したときにメモリ破壊したか、このポインタがすでにfree()されているかもしれません。
異常がないコンパイラでコンパイルした場合は、破壊した先のポインタは何の役目がないためだったかもしれません。
>最適化の差なのでしょうか?
自分は、HPのUNIXソースをLinuxに移植した時に、「動いたはずのソースが動かない」と壊滅的な被害を被った経験があります。
このときはLinuxのデバッガを使い、デバッガで異常終了したときのスタックを見ながら1つ1つ潰していきました。
(デバッガによっては見られないのかな…)
根気いるかもしれませんが、頑張ってください。
この回答への補足
ありがとうございます.
デバッガについて色々調べて,デバックしてみます.
今まで,こういう経験をしたことがないので,
デバッガ等をつかったことがないのです…
No.3
- 回答日時:
何にしてもバグが有るにも関わらず動いていただけだと思います。
確実にハングする今の状態であれば逆にプログラマにとって幸運ですよ!世の中なぜ落ちるか分らないタイミングで落ちるバグの方が多いから、それに比べりゃ凄くラッキイなんだと思いましょう。
バグの取り方。
1.落ちる操作が分っているのなら、そのアクションから関連するプログラムの部分に表示を埋め込んでどこまで実行できたか確認する。
2.freeしたメモリを指すポインタがあれば、ポインタはNULLにしておく。
3.配列はオーバーガードを自分でプログラムに埋め込むか、コンパイラのオプションでガードできるならそちらに任せる。
4.破壊されている部分が分ったらデバッガでそこを書き換えるプログラムをブレークする。
回答ありがとうございます.
落ちる場所は一応わかっています.
先達が作ったvectorクラスのvector型の要素から
double型の配列の要素へ値を代入する部分で
エラーが発生しているんだと思います.
代入をする部分でなく,代入をする関数を呼んだ
瞬間に問題が発生します.
すいません…
3と4の意味が少し分かりません.
よろしければ参考になるURL,書籍などを教えていただけませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大容量のメモリ確保をスワップ...
-
コンパイラの違いについて
-
エクセルのメモリ使用状況/Appl...
-
プログラム実行中に強制終了
-
初心者過ぎる質問ですが、VRAM...
-
closeとメモリの開放について
-
sil_rew_memのメモリアクセスに...
-
エクセルVBA 大容量CSVファイル...
-
C言語で、メモリを解放しないで...
-
C言語:関数のメモリ上でのサイ...
-
VBAの配列サイズとメモリに関して
-
ExcelのVBAでメモリ解放できない
-
ゲームプログラミングのマップ...
-
組み込み系でのmallocについて
-
変数をあなたの身近なものに例...
-
動的メモリとexit(C言語)
-
ファイルマッピング関数で失敗
-
GPUプログラミング時の表示用GPU
-
メモリの解放について VB6 VBA
-
ReadEventLogについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
C言語における再帰呼び出しの...
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
動的メモリとexit(C言語)
-
エクセルのメモリ使用状況/Appl...
-
大容量のメモリ確保をスワップ...
-
【C言語】再帰が時間がかかる...
-
バッチファイルでの実行EXEのメ...
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
ExcelのVBAでメモリ解放できない
-
これて逆じゃないですか?
-
メモリを解放しないとどうなる?
-
ファイルマッピング関数で失敗
-
エクセルVBA 大容量CSVファイル...
-
メモリアロケーション異常の発...
-
エクセル キャッシュメモリー...
-
Apacheでバーチャルホストの最...
おすすめ情報