1read 100read
2012年6月プログラム531: new/deleteで異常終了する(Visual C++) (455)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
MVVMについて語ろう (277)
【会津】パソコン甲子園2004【若松】 (777)
Squeakでマターリ語りましょうや (812)
-OOP限定-プログラム設計相談室 (842)
XNA 質問・相談スレッド 2 (915)
P2P型の完全匿名掲示板はまだ出来ないの?その3 (319)
new/deleteで異常終了する(Visual C++)
- 1 :10/01/06 〜 最終レス :12/01/04
- 大変、困っています。
Visual C++ 2008でコーディングしています。
コーディングは何度も何度も見直しました。
間違っていません。
なのに、実行するとnewで異常終了します。
debug版で動かすと動きます。release版で動かすと異常終了します。
デバッグのしようがありません。
ホントに、コーディングは正しいんです。
こういう症状の原因って何が考えられるでしょうか。
よろしくお願いします。
deleteでも異常終了します。
未初期化ポインタのdeleteとかそんなのではなくて、
本当にコーディングはあってるのに、異常終了します。
動きは、毎回違います。
例えば、printfデバッグをしようとしてprintfを
挿入すると、異常終了ポイントが変わります。
でも、newかdeleteで落ちます。
ホントに、ホントに、コーディングは合ってるのに
どうしようもありません。
もう何ヶ月も仕事が進みません。
このままだと、クビになっちゃいます。
お願いします、本当に、よろしくお願いします。
- 2 :
- それは大変だ!今すぐマイクロソフトのVisual C++ の開発責任者に電話しろ!
- 3 :
- コーディングを見直す前に
ローカルルールを見直せ
- 4 :
- ┐(´ー`)┌ < サッサト クビニナレ
- 5 :
- このスレッドは天才pンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
- 6 :
- >>1
これってdelete文を全部コメントアウトしても症状は同じ?
一再deleteしなくても一応は動くでしょ。deleteしないとメモリーオーバフローしちゃう?
- 7 :
- newで異常終了するってことは破壊されてる
- 8 :
- 世界が?
- 9 :
- 再インストールはしましたか??
- 10 :
- たぶん、間違ってないよ
- 11 :
- >>1
単発の質問でスレ立てはマナー違反な。
いちおう言っとくけど。
- 12 :
- 2008ってリリースモードでもデバッグできない?
- 13 :
- ショートカットに Visuaru C++ って書いてないかチェックした方が良いな
- 14 :
- 仕事のコードは載せられないですが、
下記のような感じなんです。
class C1 {
private:
// メンバ
int *a ; int *b ; C2 *c ; // C2はクラスね
public:
// コンストラクタ
C1( void ) { a = NULL ; b = NULL ; c = NULL ; return ; } ;
// デストラクタ
~C1( void ) { delete [] a ; delete [] b ; delete [] c ; return ; } ;
public:
// 初期化メソッド
int init( void ) {
a = new int[ 5 ] ; b = new int[ 5 ] ; c = new C2[ 5 ] ;
if ( !a || !b || !c ) {
delete [] a ; delete [] b ; delete [] c ;
a = NULL ; b = NULL ; c = NULL ;
return -1 ;
}
return 0 ;
} ;
public:
// 各種メソッド
int xxx( xxx ) { xxx ; } ;
} ;
- 15 :
- とにかく、
い。 コンストラクタでNULLを入れる。
ろ。 init()で領域確保。
は。 失敗したらNULLを入れる。
に。 deleteしたらNULLを入れる。
ほ。 デストラクタで開放する。
は、徹底してます。
上記、C2の例みたく、デストラクタが
どんどん直列に呼び出される場合があります。
- 16 :
- > 6
いま、家なので、明日会社でやってみます。
もし仮にdeleteしないでうまくいったら、
deleteが原因ってことですか?
> 7
何が破壊されていますか。
破壊のよくある失敗原因はありますか。
> 11
ごめんなさい。しりませんでした。次から気をつけます。
でも、ネットで調べても全然のってないんです。
もう、2chにアクセスするエリートプログラマしか
頼れないんです。
> 12
えっ、そんな方法あるんですか。
明日会社でトライしてみます。
- 17 :
- >>14
んー、特に問題は見あたらないなー
- 18 :
- >>16
もし、deleteを外して直るなら、同じポインタを2回deleteしてる可能性があるね。
>>14 を見るかぎり大丈夫そうだけど。
まあ、簡単に外せるなら1回外してみるのが早いけどね。
関係ないと思うけど、// 初期化メソッド でa b cのどれかがNULLだったらa b c ともdeleteしてるけど
これおかしくない? NULLポインタをdeleteする事になちゃうよ。
if ( !a || !b || !c ) {
if( a ) delete [] a;
if( b ) delete [] b;
if( c ) delete [] c;
a = NULL; b = NULL; c = NULL;
return -1;
}
return 0;
にしないと。まあ、new が失敗するなんて殆んど考えられないけどね。
- 19 :
- NULLポインタはdeleteしても問題ないだろ。
- 20 :
- ま、C1型の値をコピーしちまってるオチだろうな。
- 21 :
- >>19
これはスマン。NULLポインタにdeleteしたことなんか無かったもんで。
- 22 :
- 今日の魚影は濃いな
- 23 :
- そもそもnewが失敗した場合はNULLじゃなくて例外飛ぶから根本から間違えてんだけどな。
俺の感で言うと暗黙のoperator=でポインタをコピーして二重deleteとみた。
- 24 :
- > コーディングは何度も何度も見直しました。間違っていません。
ぼくわるくないもん! ぼくわるくないもん! ぼくわるくないもん! ぼくわるくないもん!
> なのに、実行するとnewで異常終了します。
わるいのはかんきょうだ! ぼくわるくないもん!
って時点でもうね。
ガチで書いているなら向いていないから辞めなさい。社会人を。
ネタで書いているなら向いていないから辞めなさい。人間を。
- 25 :
- しかし、何が悲しいって仕事でC++書いてるやつがこのレベルということ。
正直初心者がC++とかやると周りが不幸になるからやめたほうがいいよなー。
>>24
俺はC++で間違いなく書けたなんてRAII徹底しないと自信を持てないな。
生のポインタ使いつつ自信を持てる人をある意味、尊敬する。ある意味な。
- 26 :
- destructorに一個一個debug文を入れてどこでオチてるか
調べるのが定石
- 27 :
- >>23
一応、古い処理系だとnew失敗でnullが返る(std::nothrowなしでも)のはあるが…
自分はVS2008は使わんので分からないが、どっちなのだろうか?
>>25
烈しく同意。自分はC++に限らず「間違っていない」なんて口が割けても絶対に言えんわ。
- 28 :
- >>26
このパターンだと、多分それだと捕まらないんじゃないかなぁ。
> 動きは、毎回違います。
ってことだから。
アホの書いたコードがビルドやprintfデバッグで挙動が変わる場合、高確率でメモリ破壊やメモリ未初期化が原因。
それにより、バイナリが変わる度にヒープやスタック(やそこに残ったゴミ)の状況が変化し現象が変化する。
そしてほぼ全てのアホは、根拠皆無なのに何故か肥大化したプライドを守るために
目が曇って and/or 意図的に目を曇らせ、いくらコードを見てもそれを発見できずに自分以外の何かが原因だと喚く。
> このままだと、クビになっちゃいます。
それはヤバいね。先手を打って自分から退職願を出せば自分都合になるし退職金ももらえるよ?
- 29 :
- >>27
Visual C++ 6.0がNULLを返す最後の世代。
2008は9.0だから(数ヵ月後には2010(10.0)が出る)
普通のnewでNULLが帰ってくるのは現在考慮する必要は殆どないかと。
# 昔からのコードの保守で使わざるを得ない不幸な環境の人も多少はいるでしょうが
- 30 :
- しかもSTLは例外返すことを前提に作られてるから
メモリ無くなったらNULL参照で落ちるという糞処理系
まあ例外投げるようにすることはできるから
そうすりゃいいだけの話ではあるが
- 31 :
- operator=()とコピーコンストラクタをprivateに宣言して、
コンパイルが通るかどうか
- 32 :
- 最善案
C++じゃなくC#或はJavaで書いてみる。
十分本質的なコードが出来た後にC++に移植する。
プログラムに課せられている問題と、C++特有の
技術上の問題がごっちゃになると難しい。(特に
VCは細かい技術上の配慮が必要で繊細)
(いきなりC++で完璧なコードを作ること自体に無
理がありそう。それなりにCやC#,Javaの経験があっ
たほうがいい)
C++コード書けるんだったらJava,C#の
コードを書くのはそれほど難しくは無い。
ただライブラリ関数の名前を覚えたり
調べたりするのがちょっと最初はきついかも
- 33 :
- どこが最善なのか。
- 34 :
- バグッたC/C++コードのデバッグだけはしないほうが
良い。精神衛生上問題が大有りだから。
仕様書がある限り、潔くそのコードを捨てて
書き直すのが最善。
JavaやC#とかのようなものでもそれが言える
C++だったら尚更。
- 35 :
- >>34
急がば回れ
でつねw
- 36 :
- プログラミング言語c++隅から隅まで読めば
>>14のコードじゃバグるのわかるだろ
- 37 :
- > ホントに、コーディングは正しいんです。
?
- 38 :
- Javaとかだったら
class c;
と
class[] c;
を混同しようものならコンパイルが通らないから
そういった系統のバグは発生しない点では初学者には優しいか...
- 39 :
- なるべく自分でメモリ管理しない
new C2[5] とかしないで std::vector<C2> を使う
添え字の範囲もチェックする
- 40 :
- クビになったらまた教えてね
- 41 :
- 1は勤め先間違えたような感じが
- 42 :
- >>1 まず最初にするべきなのは、そげぶ
>ホントに、コーディングは正しいんです。
その幻想をぶち壊すこと。
- 43 :
- >>15そのコーディングスタイルは効果が薄い上に問題がある。
> い。 コンストラクタでNULLを入れる。
> ろ。 init()で領域確保。
まずコンストラクタとinitを分ける必要が無い。しかもinitを忘れないように徹底するのが難しい。
NULLがあるとNULLの場合の動作も対応する必要がありプログラムを安定させるのが難しくなる。
> は。 失敗したらNULLを入れる。
newで失敗すると例外が投げられるので意味が無い。
> に。 deleteしたらNULLを入れる。
> ほ。 デストラクタで開放する。
>は、徹底してます。
これらの徹底は難しいよ。参照とRAIIとスマポを使おう。ともかく生ポは扱わないのが近道。
追伸 目で見て確認は徹底とは言えないので注意
- 44 :
- >> 6, 18
ダメでした。deleteを一切しなくても、newで落ちます。
>> 12
やり方が良く分かりませんでしたが、異常終了ポイントや変数値の
チェックはできました。printfデバッグで異常終了するnewの直前まで
正しい値が出力される変数ですら、異常終了時にはめちゃめちゃに
破壊されてます。それどころか、プログラム全般にわたり変数の多くの
値がデタラメに改竄されてます。
>> 23, 27, 29
確かにそのようですね。勉強になりました。ただ、今回はそう簡単でも
ありません。例外をキャッチするコードを挿入しましたが、とにかく
newの途中で異常終了するので役に立ちません。
>> 24, 42
コーディングは合ってると書いたのは、単に質問だけすると、
ポインタの扱いとかdeleteの失敗とかそういう初心者向けの
コメントしか来ないだろうと思ったので、敢えて書きました。
コーディングとは別のところで良く陥るミスとかないですか。
例えば、コンパイラオプションを間違えてるとか。
>> 28
メモリ管理の問題の可能性が高いとは私も思っています。
ただ、newで落ちるというのが解せません。例え、メモリ
管理が間違っていて、誤った代入がされていたとしても、
newで落ちますか?どんな時に、newで異常終了しますか?
- 45 :
- 話変わりますが、今日、情報処理の合格証書が届きました。
嬉しいんですが、このデバッグが終わらないと、心から喜べません。
よろしくお願いします。
- 46 :
- C2 クラスが怪しい
- 47 :
- 俺の指摘が正しかったようだ
- 48 :
- >>38あたりが良いヒントかな
- 49 :
- >>44 そげぶ
>コーディングとは別のところで良く陥るミスとかないですか。
その幻想をぶち壊さないと前に進めないよ。
とりあえず、落ちる最小のコードをupしてごらん。
- 50 :
- deleteで例外吐くときってポインタがマイナス方向に走ってヒープ壊してる以外にないよね
- 51 :
- >>44
まず、その「俺のノーミソは機能している」という幻想をぶち壊す。
> メモリ管理が間違っていて、誤った代入がされていたとしても、newで落ちますか?
相も変わらず、ぼくわるくないもん!!!か。
あらゆる参照可能なメモリにあらゆる値が存在しうる場合に発生しうる全ての現象が起こる。
電卓ソフトがメモリ破壊が原因で暴走し、突如モナリザの絵を200枚連続で
プリンタから出力することもありうる。しかもカラーで。
- 52 :
- >>12
VisualStudio2008はりリースモードでもデバッグ情報作るからデバッグできるよ。
- 53 :
- まぁ他人に問題解決頼むなら問題を発生させる最小のコードが必要だよね。
# とはいえそこまで出来たら後は自分で殆ど解決してしまうけど
- 54 :
- > コーディングは合ってると書いたのは、単に質問だけすると、
> ポインタの扱いとかdeleteの失敗とかそういう初心者向けの
> コメントしか来ないだろうと思ったので、敢えて書きました。
> コーディングとは別のところで良く陥るミスとかないですか。
> 例えば、コンパイラオプションを間違えてるとか。
これはどうみても
「お前らごときが俺のプログラムの不具合を詮索ことが許されると思っているか。
お前らが思うような不具合など、俺様のプログラムに存在することなど絶対にありえない。
俺様のプログラムが完全であると認め、それ以外の不具合の原因を俺様のために追求せよ」
と言っているのに等しい。
もうね、こんな奴プログラマー失格とか社会人失格とかってレベルじゃない。
会社にいたら死力を尽くして距離を置いて、接近されぬよう逃げるべき相手。
もはや>>44の一番適切な回答は、「ハイソーデスネ、アナタノプログラムモンダイハアリマセンヨ」だ。
(参考文献 http://glossary.tank.jp/t0018.html)
- 55 :
-
他のPCでコンパイルしてみたら?
- 56 :
- Cで長年、生ポインタ使った経験が無いとC++を使うのは難しい
- 57 :
- 「コンパイルが通る」=「完璧なシンタックスだ」=「おれは間違ってない!」とかよくある話で。
まあ向いてないんだろうね。
- 58 :
- main関数で他のルーチンに飛ばす部分を一切コメントアウトして適当な配列だけnewしてみたらどうなるの?
- 59 :
- C2のコンストラクタがぶっ壊れてんじゃねーの?
- 60 :
- アドヴァイスしてるやつも同類のアホだなw
- 61 :
- どういう条件で落ちるのかも正確に出てないのに解決なんてするわけ無いだろう。
どういう条件で落ちるのかも正確に書けない奴のコードが正しいはず無いだろう。
- 62 :
- メモリが破壊されるタイミングだと考えている瞬間よりもっと前にメモリアロケータの管理領域を破壊している
既に致命傷を受けていてdeleteでとどめを刺されているだけ
- 63 :
- おそらくbuffer overrun
- 64 :
- c[5]とか書き換えてるよね
- 65 :
- たぶんこれで壊れるんだろ。>>14のコードから見て
c1 = c2;
or
C1 c1(c2);
- 66 :
- VCでdebugモードで動いて、rekeaseモードで動かないってオレもあった気がする。
なにが原因だったかは忘れた。
これって人のプログラムを直してるの?
そうじゃなかったら、最後に動いた状態まで戻せないの?
- 67 :
- >>60
間抜けなことに、本人も「アドバイスしてるつもり」だから
余計タチが悪いよな。
- 68 :
- 今日ちょっと進展がありました。
クラッシュを起こすクラスを使用するプログラムの、
落ちる部分とはぜんぜん違うところのとあるコードを変更したところ、
newやdeleteでのクラッシュが起きなくなりました。
変更したところは、その部分のテストでは特に問題なくて、
その部分でエラーが起きたこともないんですが、ちょっとその部分の
コードを変えました。
すると、突然、しっかり動き出しました。
解決したと思っていいのか、よく分からないですが、
今日のところは問題は起きてません。
- 69 :
- 直したコードのところでヒープぶっこわしてたんだろ。参考までにプロジェクトの名前教えてくれ。見掛けても使わないようにするから。
- 70 :
- よくわかんないけど動いたのでこれでいいです
- 71 :
- まあ動けばいいよ。またエラー出たときに考えればいいよ。
- 72 :
- >>14
おまえみたいな初心者は頼むからSTL使ってくれ。
#include <vector>
class C1 {
private:
// メンバ
std::vector<int> a;
std::vector<int> b;
std::vector<C2> c;
public:
// コンストラクタ
C1( void ) : a(5, 0), b(5, 0), c(5, C2()) {}
// デストラクタ
~C1( void ) {}
public:
// 初期化メソッド
int init( void ) { return 0; }
public:
// 各種メソッド
int xxx( xxx ) { xxx ; }
};
- 73 :
- >>72
おいおい…初心者に罠イクナイ。ここまで頭の悪い奴にSTLを使わせても
自分でデバッグできない不具合を埋め込んでゴネだすのがオチだぞ…
>>14
おまえみたいな初心者は頼むから会社もプログラマーも辞めてくれ
- 74 :
- ちゃんと動いてるんだから黙っててください
- 75 :
- >>74
え? 明らかに>>1のノーミソの不具合があるのに、
それによる観測結果が正しいだなんて誰が保証を(ry
- 76 :
- 保証なんていらないし
- 77 :
- × ちゃんと動いている
○ 一見動いているように見える
◎ 動くか動かないか分からないが、今のところは落ちない
「ちゃんと動く」ってのと「今は落ちていない」の違いも理解できないのか?
- 78 :
- 頻繁に落ちてたのが落ちなくなったなら99%直ってるよ
- 79 :
- 別に言葉遊びしたいわけじゃないからどうでもいい
ちゃんと動くもちゃんと動いているように見えるも同じ
- 80 :
- 今年はこういう白痴新人が入ってきませんように
- 81 :
- >>78,79
趣味のコードならそれでいいさ。誰も困らないからね。
>>80
この手のはマジで会社の寄生虫だよな…>>1のように他人のせいにして
学習せず原因を追求せず30過ぎても40過ぎても>>1と同レベルのコードを書く。
- 82 :
- >>81
別に>>1が汚いコード書こうが81は困らない
だからどうでもいいだろ。
おまえが>>1のコードで直接被害うけてるならともかく第三者のくせにごちゃごちゃいうなみっともない
- 83 :
- >>81の書き込みで被害を受けない>>82がごちゃごちゃいってみっともない件について
- 84 :
- 動けば良い→企業人の鑑のようなハツゲンだが、後悔先に立たず
企業内でコードを書くことは少なからず責任を伴う。
どうしてうまくいかないのか悩む→学生の鑑のような行為だが
企業内で研究開発は兎も角、勉強や学習をするのは会社法に
抵触する犯罪。こちらのほうがずっと深刻で、こういうことが
まかり通っているとその会社は破滅の路を辿っていることになる。
- 85 :
- 開発だよね
- 86 :
- >>84
つまり技術の無い奴は来るなということですね
- 87 :
- >>82
お前が一番みっともないんだけどな
- 88 :
- >>68
目処が付きそうで良かったね。
2chの中でもプログラム関係は本当に人を攻撃するのが好きだよね。
- 89 :
- 単発質問スレを立てた上に、言われた内容を理解できない馬鹿は叩かれて当然だけどな
- 90 :
- >>86
会社に相当する団体が大杉なんだこの国は
- 91 :
- 異常終了の原因は100%メモリ管理なので、
メモリ管理を指摘するだけのコメントはアドバイスにならない
- 92 :
- でも本人が
ソースは見せられませんが私の書いたコードは間違っていません! VC++のバグです! それ以外の答えはお断りします! って言ってるんじゃねぇ。メモリ管理のバグがなんにせよ、問題の箇所が見えなきゃアドバイスも何もないよ
- 93 :
- 仕事があまりにも遅れてるので、今日も出社してました。
今のところ、問題は再発してません。
アドバイスを下さった方々、ありがとうございます。
今回のように、newで落ちる(またはdeleteで落ちる)という
デバッグが極めて難しい状況に陥った時、うまくデバッグする
方法はあるでしょうか。
しかも、今回はたまたま問題箇所が見つかりましたが、
落ちるクラスを使用する部分と全然違う部分のコードが
原因でした。
このような時にどようにデバッグするのがいいのか
アドバイスをいただければと思います。
よろしくお願いします。
- 94 :
- >>93
> デバッグが極めて難しい状況に陥った時、うまくデバッグする方法はあるでしょうか。
端的に言うと「発生させるな、レビューと実装規約で抑えろ」だ。だがお前には無理だ。
お前のように正しいと決めつける奴、つまりお前には無理だ。
絶対に正しいレビューはできない。絶対にお前には無理だ。
- 95 :
- 仕事をわざと遅らせ、残業代稼ぎの為の出社だと
会社の人は見ています。下手すると詐欺で
されるかもしれません。
- 96 :
- 素人はJavaでも使ってればいいのに
- 97 :
- C/C++コンパイラでコンパイル時に警告が出ているコード
は既にある程度バグを含んでいるとすら言える。
>>1はこのスレを立てた段階のコードをまだ持っていれば
再度コンパイルしてみれば?
多分警告が多数出てる筈。その警告の原因一個一個潰すと
エラーの原因がわかる筈。
- 98 :
- JavaはC++がまったくわからんって人が使うと
危険だろ
- 99 :
- valgrindみたいなツールでメモリの不正アクセス箇所を探せばいいんじゃねえの
Windowsにおけるvalgrind相当のツールは知らんけど
- 100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
OpenMPプログラミング (365)
VIPPERでもわかるプログラミングVer15 (500)
Cygwin + MinGW + GCC 相談室 Part 6 (788)
【注意】STLの落とし穴【危険】 (852)
BASICの宿題はお前にまかせた (550)
【ヤパーリ】XMLをS式に置換えていくスレ【LISP最強】 (240)
--log9.info------------------
モバゲー総合スレ part1 (784)
【GREE】ビックリマン 第17弾 (949)
【GREE】戦国キングダム24【期待を裏切らない運営】 (599)
【GREE】ワールドサッカーコレクション3【KONAMI】 (684)
【GREE】スーパー戦隊ウォーズ16 (851)
【facebook】フェイスブック 24冊目 (765)
【mixi】ビックリマン 4 (495)
仮面ライダーウォーズ質問専用スレ 3 (727)
【GREE】プロ野球ドリームナイン270球目【KONAMI】 (1001)
【GREE】バイオハザード アウトブレイク サバイヴ9 (506)
【GREE】聖戦ケルベロス 158戦目 (611)
【GREE】ドラゴンコレクション451匹目 (1001)
GREE 嫁が昨日浮気した (376)
【GREE】海賊王国コロンブス Part46 (787)
総合SNS Suimy 招待スレ (327)
【GREE】ドラゴンリーグ◆4連コンボ (629)
--log55.com------------------
あと一週間で死ぬとしたらどうする?
「人生」という超ハードゲーについて 2
毎日歯磨きと風呂がキチンとできない
【何のために】モラトリアム人間【生きる】
嫌われたかもしれない、って悩むやついない?
いじめイクナイ(・A・)
自らを改めたい変わりたい奴が報告しあうスレ
車欲しいお
-