- ベストアンサー
Windowsでエラーが起きる原因とは?
- Windowsではエラーが発生するが、Macでは正常に実行できる
- エラーメッセージは"XXXXX.exe has triggered a breakpoint."で、VC++上の"malloc.c"タブが開く
- WindowsとMacの環境の違いが原因でエラーが発生している可能性がある
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>XXXXX.exe has triggered a breakpoint. 意味は「XXXXX.exeはブレークポイントで停止した」です。 malloc.cの所で出るとしたら「ヒープ領域を破壊している」と思います。 Visual C++ 2013の場合、ヒープ領域を破壊すると、mallocの内部で「ブレークポイントで例外停止」するようになっています。 んで dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N); は、明らかにおかしいです。 dcmplx型をN個分確保したいのに、double型をN個分しか確保してません。 正しくは dcmplx *Phi = (dcmplx*)malloc(sizeof(dcmplx)* N); じゃないかと思います。 あと、MacのXcodeでは、ヒープを破壊すると APPNAME_XXX(????,0x????????) malloc: *** error for object 0x????????: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug と言うエラーが出る筈だけど、Visual C++ 2013とは実装が異なるので、偶然「使ってないヒープ領域を壊しただけ」の場合は、エラーも出ないし、何も起きず、普通に「ちゃんと実行したフリ」をする筈です。 ヒープ領域は、壊し方によっては、Visual C++ 2013でも「エラーも出ないし、何も起きず、普通にちゃんと実行したフリをする」で終わるので、なかなかバグが見付からない場合もあります。
その他の回答 (4)
- chie65536(@chie65535)
- ベストアンサー率44% (8754/19864)
追記の追記。 mallocされたメモリが開放されないまま、次々に新しいメモリが確保されていき、使い終わったメモリが誰にも開放されないままプログラムが終了している(メモリリークしている)が、Nの最大値は1024くらいなので、ほぼ実害は無い。 doubleの値が数千個分メモリリークした所で今のOSは屁でもないので、ユーザーメモリがちょっと減ってオシマイになるだけ。 このプログラムを何千万回も動かすとか、ずっと常駐させて繰り返し動かすとかすれば、実害が出るだろうけど。
お礼
他の方への質問の回答までありがとうございます!これくらいでは問題ないとのことで。 ただ、できるだけ解放する癖をつけておきます!
- chie65536(@chie65535)
- ベストアンサー率44% (8754/19864)
追記。 scanf系関数について http://www.isc.meiji.ac.jp/~re00030/jse/scanf.html scanf系は 浮動小数点(次の3つは同じである) f 入力を浮動小数(float型)と解釈 e,E 入力を浮動小数(float型)と解釈 g,G 入力を浮動小数(float型)と解釈 オプション l long型の整数またはdouble型の浮動小数点を意味する(小文字のエル) って事になっている。 なので、%gって書いたら、floatのポインタが指定されているとして実行するんで、正しく代入されない。 doubleのポインタを指定する場合は、%lf、%le、%lE、%lg、%lGのどれかを指定すること。 「%gで良い」と言う回答は無視すること。
お礼
ありがとうございます!分かって書いたつもりなのに指摘されるとそうなのかな?と思ってしまいました。 他の回答も順次チェックしてコメントしていきます。
- Wr5
- ベストアンサー率53% (2173/4061)
とりあえず……malloc()して、そのあとどこで解放していますかね? >for (pow2 = 7; pow2 <= 10; ++pow2){ のループでそれぞれNはいくつになりますかね?
お礼
malloc()と同じループの中に、 free(nu); free(Vp); free(chi); free(phi); free(Phi); を入れてみましたが、dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N)の部分をdoubleのままにしていたら今まで同様のエラーが出ました。dcmplxにしたら、freeをいれても実行できました。 この場合、このfreeは必要なんでしょうか?癖をつけておいた方がいいとか。また、書き方としてはこれで問題ないですよね?
- f272
- ベストアンサー率46% (8529/18254)
よく見る気はないけど,とりあえず fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2); これの%lgはC89やC++ではエラーじゃないのかなあ。C99では無視されるようだけど。 普通に%gにすればいいのに。
お礼
おお、何という単純なミス(ただ、仕組みについては複雑?)だったんでしょう! メモリサイズを確保するために同じようにそれ以外の変数同様に行っていたため、コピーペーストで最後の部分だけ書き換え忘れたようです! 修正したら、正しく実行できました!ありがとうございます!