new/deleteで異常終了する(Visual C++)
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/01/06(水) 20:35:52Visual C++ 2008でコーディングしています。
コーディングは何度も何度も見直しました。
間違っていません。
なのに、実行するとnewで異常終了します。
debug版で動かすと動きます。release版で動かすと異常終了します。
デバッグのしようがありません。
ホントに、コーディングは正しいんです。
こういう症状の原因って何が考えられるでしょうか。
よろしくお願いします。
deleteでも異常終了します。
未初期化ポインタのdeleteとかそんなのではなくて、
本当にコーディングはあってるのに、異常終了します。
動きは、毎回違います。
例えば、printfデバッグをしようとしてprintfを
挿入すると、異常終了ポイントが変わります。
でも、newかdeleteで落ちます。
ホントに、ホントに、コーディングは合ってるのに
どうしようもありません。
もう何ヶ月も仕事が進みません。
このままだと、クビになっちゃいます。
お願いします、本当に、よろしくお願いします。
0051デフォルトの名無しさん
2010/01/07(木) 23:06:54まず、その「俺のノーミソは機能している」という幻想をぶち壊す。
> メモリ管理が間違っていて、誤った代入がされていたとしても、newで落ちますか?
相も変わらず、ぼくわるくないもん!!!か。
あらゆる参照可能なメモリにあらゆる値が存在しうる場合に発生しうる全ての現象が起こる。
電卓ソフトがメモリ破壊が原因で暴走し、突如モナリザの絵を200枚連続で
プリンタから出力することもありうる。しかもカラーで。
0052デフォルトの名無しさん
2010/01/07(木) 23:07:26VisualStudio2008はりリースモードでもデバッグ情報作るからデバッグできるよ。
0053デフォルトの名無しさん
2010/01/08(金) 00:04:39# とはいえそこまで出来たら後は自分で殆ど解決してしまうけど
0054デフォルトの名無しさん
2010/01/08(金) 00:45:37> ポインタの扱いとかdeleteの失敗とかそういう初心者向けの
> コメントしか来ないだろうと思ったので、敢えて書きました。
> コーディングとは別のところで良く陥るミスとかないですか。
> 例えば、コンパイラオプションを間違えてるとか。
これはどうみても
「お前らごときが俺のプログラムの不具合を詮索ことが許されると思っているか。
お前らが思うような不具合など、俺様のプログラムに存在することなど絶対にありえない。
俺様のプログラムが完全であると認め、それ以外の不具合の原因を俺様のために追求せよ」
と言っているのに等しい。
もうね、こんな奴プログラマー失格とか社会人失格とかってレベルじゃない。
会社にいたら死力を尽くして距離を置いて、接近されぬよう逃げるべき相手。
もはや>>44の一番適切な回答は、「ハイソーデスネ、アナタノプログラムモンダイハアリマセンヨ」だ。
(参考文献 http://glossary.tank.jp/t0018.html)
0055デフォルトの名無しさん
2010/01/08(金) 08:15:19他のPCでコンパイルしてみたら?
00567
2010/01/08(金) 08:22:330057デフォルトの名無しさん
2010/01/08(金) 09:10:57まあ向いてないんだろうね。
0058デフォルトの名無しさん
2010/01/08(金) 09:12:250059デフォルトの名無しさん
2010/01/08(金) 09:32:200060デフォルトの名無しさん
2010/01/08(金) 10:29:400061デフォルトの名無しさん
2010/01/08(金) 12:22:20どういう条件で落ちるのかも正確に書けない奴のコードが正しいはず無いだろう。
0062デフォルトの名無しさん
2010/01/08(金) 14:09:29既に致命傷を受けていてdeleteでとどめを刺されているだけ
0063デフォルトの名無しさん
2010/01/08(金) 15:42:110064デフォルトの名無しさん
2010/01/08(金) 15:45:520065デフォルトの名無しさん
2010/01/08(金) 16:17:06c1 = c2;
or
C1 c1(c2);
0066デフォルトの名無しさん
2010/01/08(金) 19:14:47なにが原因だったかは忘れた。
これって人のプログラムを直してるの?
そうじゃなかったら、最後に動いた状態まで戻せないの?
0067デフォルトの名無しさん
2010/01/08(金) 21:13:09間抜けなことに、本人も「アドバイスしてるつもり」だから
余計タチが悪いよな。
00681
2010/01/08(金) 21:36:31クラッシュを起こすクラスを使用するプログラムの、
落ちる部分とはぜんぜん違うところのとあるコードを変更したところ、
newやdeleteでのクラッシュが起きなくなりました。
変更したところは、その部分のテストでは特に問題なくて、
その部分でエラーが起きたこともないんですが、ちょっとその部分の
コードを変えました。
すると、突然、しっかり動き出しました。
解決したと思っていいのか、よく分からないですが、
今日のところは問題は起きてません。
0069デフォルトの名無しさん
2010/01/08(金) 21:39:260070デフォルトの名無しさん
2010/01/08(金) 21:42:3100717
2010/01/08(金) 21:53:550072デフォルトの名無しさん
2010/01/08(金) 21:57:06おまえみたいな初心者は頼むから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 ; }
};
0073デフォルトの名無しさん
2010/01/08(金) 22:01:14おいおい…初心者に罠イクナイ。ここまで頭の悪い奴にSTLを使わせても
自分でデバッグできない不具合を埋め込んでゴネだすのがオチだぞ…
>>14
おまえみたいな初心者は頼むから会社もプログラマーも辞めてくれ
0074デフォルトの名無しさん
2010/01/08(金) 23:25:520075デフォルトの名無しさん
2010/01/08(金) 23:30:59え? 明らかに>>1のノーミソの不具合があるのに、
それによる観測結果が正しいだなんて誰が保証を(ry
0076デフォルトの名無しさん
2010/01/08(金) 23:42:360077デフォルトの名無しさん
2010/01/08(金) 23:49:38○ 一見動いているように見える
◎ 動くか動かないか分からないが、今のところは落ちない
「ちゃんと動く」ってのと「今は落ちていない」の違いも理解できないのか?
0078デフォルトの名無しさん
2010/01/08(金) 23:57:370079デフォルトの名無しさん
2010/01/08(金) 23:57:48ちゃんと動くもちゃんと動いているように見えるも同じ
0080デフォルトの名無しさん
2010/01/09(土) 00:05:410081デフォルトの名無しさん
2010/01/09(土) 00:15:40趣味のコードならそれでいいさ。誰も困らないからね。
>>80
この手のはマジで会社の寄生虫だよな…>>1のように他人のせいにして
学習せず原因を追求せず30過ぎても40過ぎても>>1と同レベルのコードを書く。
0082デフォルトの名無しさん
2010/01/09(土) 00:55:17別に>>1が汚いコード書こうが81は困らない
だからどうでもいいだろ。
おまえが>>1のコードで直接被害うけてるならともかく第三者のくせにごちゃごちゃいうなみっともない
0083デフォルトの名無しさん
2010/01/09(土) 01:13:030084デフォルトの名無しさん
2010/01/09(土) 02:50:21企業内でコードを書くことは少なからず責任を伴う。
どうしてうまくいかないのか悩む→学生の鑑のような行為だが
企業内で研究開発は兎も角、勉強や学習をするのは会社法に
抵触する犯罪。こちらのほうがずっと深刻で、こういうことが
まかり通っているとその会社は破滅の路を辿っていることになる。
0085デフォルトの名無しさん
2010/01/09(土) 04:48:310086デフォルトの名無しさん
2010/01/09(土) 10:58:55つまり技術の無い奴は来るなということですね
0087デフォルトの名無しさん
2010/01/09(土) 11:22:00お前が一番みっともないんだけどな
00886
2010/01/09(土) 11:59:16目処が付きそうで良かったね。
2chの中でもプログラム関係は本当に人を攻撃するのが好きだよね。
0089デフォルトの名無しさん
2010/01/09(土) 12:56:290090デフォルトの名無しさん
2010/01/09(土) 17:10:51会社に相当する団体が大杉なんだこの国は
0091デフォルトの名無しさん
2010/01/09(土) 20:27:39メモリ管理を指摘するだけのコメントはアドバイスにならない
0092デフォルトの名無しさん
2010/01/09(土) 21:01:46ソースは見せられませんが私の書いたコードは間違っていません! VC++のバグです! それ以外の答えはお断りします! って言ってるんじゃねぇ。メモリ管理のバグがなんにせよ、問題の箇所が見えなきゃアドバイスも何もないよ
00931
2010/01/09(土) 22:32:34今のところ、問題は再発してません。
アドバイスを下さった方々、ありがとうございます。
今回のように、newで落ちる(またはdeleteで落ちる)という
デバッグが極めて難しい状況に陥った時、うまくデバッグする
方法はあるでしょうか。
しかも、今回はたまたま問題箇所が見つかりましたが、
落ちるクラスを使用する部分と全然違う部分のコードが
原因でした。
このような時にどようにデバッグするのがいいのか
アドバイスをいただければと思います。
よろしくお願いします。
0094デフォルトの名無しさん
2010/01/09(土) 22:34:59> デバッグが極めて難しい状況に陥った時、うまくデバッグする方法はあるでしょうか。
端的に言うと「発生させるな、レビューと実装規約で抑えろ」だ。だがお前には無理だ。
お前のように正しいと決めつける奴、つまりお前には無理だ。
絶対に正しいレビューはできない。絶対にお前には無理だ。
0095デフォルトの名無しさん
2010/01/09(土) 22:55:59会社の人は見ています。下手すると詐欺で告訴
されるかもしれません。
0096デフォルトの名無しさん
2010/01/09(土) 23:00:450097デフォルトの名無しさん
2010/01/09(土) 23:11:46は既にある程度バグを含んでいるとすら言える。
>>1はこのスレを立てた段階のコードをまだ持っていれば
再度コンパイルしてみれば?
多分警告が多数出てる筈。その警告の原因一個一個潰すと
エラーの原因がわかる筈。
0098デフォルトの名無しさん
2010/01/09(土) 23:26:15危険だろ
0099デフォルトの名無しさん
2010/01/09(土) 23:27:29Windowsにおけるvalgrind相当のツールは知らんけど
0100デフォルトの名無しさん
2010/01/09(土) 23:32:440101デフォルトの名無しさん
2010/01/09(土) 23:38:09俺の先輩で、数万円の残業代稼ぎに腹を立てた
アホ監査役のせいか、クビになっただけでなく
億単位の損害賠償を民事で引っ掛けられた人
知ってるんで、コードが動かないから残業しよう
なんてことはしないほうがいいんじゃないか..
0102デフォルトの名無しさん
2010/01/09(土) 23:58:03俺の先輩では動かないコードを放置して有給休暇を取って
旅行に行ったらその間に勝手にリリースされちゃって
客先がそのソフトを使って事故を起こしてしまったらしく
警察沙汰(業務上過失致死傷のカドで逮捕者も出たらしい)
になったらしいから、コードが動かない、或いは問題を含む
ことを知りながら放置するのだけはやめたほうがいいと思う
ね。
0103デフォルトの名無しさん
2010/01/10(日) 00:56:45>億単位の損害賠償を民事で引っ掛けられた人
損害賠償請求権等不存在確認請求訴訟を起こすべきレベル
0104デフォルトの名無しさん
2010/01/10(日) 01:44:080105デフォルトの名無しさん
2010/01/10(日) 10:39:410106デフォルトの名無しさん
2010/01/10(日) 12:24:250107デフォルトの名無しさん
2010/01/10(日) 14:28:410108デフォルトの名無しさん
2010/01/10(日) 14:34:430109デフォルトの名無しさん
2010/01/10(日) 14:40:32自称プロよりよっぽど良い。
日本人はよっぽどスキル高くないと雇われん
0110デフォルトの名無しさん
2010/01/10(日) 14:51:26それ以前にどういうバグだったのかを知りたいわ。
こんなエスパー相手にしているようなスレ立てるやつにプログラム書けるわけない。
0111デフォルトの名無しさん
2010/01/10(日) 15:51:37情報工学の修士が雇えたりする
0112デフォルトの名無しさん
2010/01/10(日) 15:57:15特にプログラムなんかいじってなくて、
別のメモリーがたっぷり積んであるマシンで動かしたら落ちなかったとか、
メモリ常駐のプログラムを増やしたり減らしたりしたら落ちなくなったとか、
そういう話なんじゃないかな?
0113デフォルトの名無しさん
2010/01/10(日) 15:57:210114デフォルトの名無しさん
2010/01/10(日) 17:04:06情報処理うかったくらいで一流プログラマの仲間入りしたつもりなら大間違い。
0115デフォルトの名無しさん
2010/01/10(日) 17:38:060116デフォルトの名無しさん
2010/01/10(日) 17:41:47> コーディングは何度も何度も見直しました。
> 間違っていません。
これほど傲慢な質問者は他にいない
01171
2010/01/11(月) 01:35:23バグを発生させなければいいというのは確かにそうですね。
勿論その努力をすべきだと思います。
ただ、それでもバグが起きてどうにもならなくなった時
どうするのがいいでしょうか。
>>95, >>101
うちの会社は残業代出ませんので、そういう問題は起こりません。
>>97
いえ、警告は一切なしです。常々、私は警告であっても、必ず
対処するように心がけています。いつも、警告なしでコンパイルを
通ったコードで異常終了するバグに悩まされています。
01181
2010/01/11(月) 01:37:18全部話すと長くなるのですが、今回の開発は私とSさんで分担して
やってます。私がライブラリを作り、Sさんは私の作ったライブラリを
使って実行プログラムを2つ作ります。
私の作ったライブラリのクラスC1のコード内のnewやdeleteで異常終了
する不具合が見つかったのは、もう3ヶ月くらい前のことです。
もともとは私の担当しているコードで異常終了したため、問題は私の
コードにあるのではないかと思い、何度も何度も見直しました。
単体テストでは問題なく、コードレビューでも問題なく、まったく
異常終了の原因が見当たらなかったのです。
なので、Sさんの方に問題があるのではないかと思い、Sさんに
原因調査を依頼しましたが、何だよバグはお前だろみたいな感じで
あまりやってくれないので、時間が経ってしまいました。
確かに、私のコードで落ちるので、私も、再度、テストし、コードも
見直し、何度も何度もチェックしたのですが、問題はなく、Sさんの
コードに問題があるのではないかと言うと、お前のコードで落ちるん
じゃないか人のせいにするのかよみたいな感じで、まったくデバッグが
進みませんでした。
01191
2010/01/11(月) 01:38:26してもまったく進まないので、一緒にやることにしました。
debugビルドで動き、releaseビルドで異常終了。printfデバッグでも
原因が全く掴めない状態で困難を極めました。とにかく、私は、自分の
コードはもう間違ってないと思っていたので、実行プログラムの
ソースコードを直さないとどうにもならないと思っていました。
実行プログラムは2つありますが、問題はその片方だけで起こります。
なので、実行プログラムの方に問題があると私は尚更思いました。
そこで、問題の実行プログラムのソースコードの各所をコメントアウト
するかそれが無理なら無害なスタブに置き換えてテストしてもらいました。
というか、一緒にやりました。ふざけんなよまだおれを疑ってんのかよ
お前のコードで落ちるんじゃねぇかみたいな雰囲気のまま、強引に
やりました。すると、ある部分をコメントアウトしたら異常終了しない
ことが分かりました。その部分は、異常終了するクラスを使う部分とは
全く別の所で、想像もつかないような所でした。
私はその部分のコードを見直すようにお願いしたんですが、
これもなかなか進まなくて、コードを変えろと言っても、
forをwhileにしたり、ちょっと行を入れ替えたり、式の形を変えたり
して持って来るので、私がコードレビューして、ちょっと気になる
ところがあったので、ループと分岐の作りを変えてもらうと、
異常終了が起こらなくなりました。
なので、その部分のコードにメモリを破壊する何らかの原因があったん
だろうと思っています。
0120デフォルトの名無しさん
2010/01/11(月) 01:41:590121デフォルトの名無しさん
2010/01/11(月) 01:41:59GCCやらBCCやらDMCやらいろいろあるだろ?
0122デフォルトの名無しさん
2010/01/11(月) 01:46:58言語訓練のために立てたものではありません。
アイと研究員とのやり取りに利用するスレッドではないので、
関係者以外も書きこんで下さい。
京都大学霊長類研究所
0123デフォルトの名無しさん
2010/01/11(月) 01:49:580124デフォルトの名無しさん
2010/01/11(月) 01:55:480125デフォルトの名無しさん
2010/01/11(月) 02:09:51職場の同僚にどういった頼み方をしたのかは推して知るべしだな。
0126デフォルトの名無しさん
2010/01/11(月) 05:45:08ある箇所を削除して、コンパイルは通るが同様のエラーが
発生するコードをupすべき。
ここの連中が必ず真の原因箇所を突き止めるだろうから。
本当にVCのバグだとしたら、結構怖い話になってくる。
Windowsマシンを基幹システムに繋げるなって話にも
繋がってくるし..
0127デフォルトの名無しさん
2010/01/11(月) 07:53:18デバッグ版で動くという事は基本的なコードの誤りは無いのでしょう。
リリース版のみで異常終了し、トレース文などを入れると終了する場所が変わったり正常動作するというのは何度か経験があります。
原因は28の人が書いてあるとおりだと思います。
例えばこんな感じ
long CalcArraySize(long& lArraySize); // 宣言
(略)
long lArraySize; // すぐにCalcArraySizeで値が設定されるので初期化しない
CalcArraySize(lArraySize); // ここで配列の必要サイズが取得されるはずだが、エラーだと不定値のまま
m_pClass = new CMyClass[lArraySize]; // 万が一lArraySizeが不定値だと異常終了するかもしれない
オート変数でも宣言時に初期化すればデバッグ版とリリース版で挙動が異なる事は少なくなるはずです。
でも今更全ての変数に初期化文を入れるなんて現実的じゃないかもしれませんね。
P.S.
複数のDLLを使用するアプリで、デバッグ版とリリース版のDLLが混合しているとかないですよね?
そういうのが考慮された造りなら問題ないけど、何も考えていないとメモリの取得や開放で異常終了します。
0128デフォルトの名無しさん
2010/01/11(月) 07:56:440129デフォルトの名無しさん
2010/01/11(月) 08:04:40な?やっぱりお前には無理だろ。
リーク系の不具合は追跡困難だから発生させるな。
だが、お前みたいな奴には発生を未然に防ぐことなんてできない。
お前には無理だ。
0130デフォルトの名無しさん
2010/01/11(月) 08:23:48>基本的なコードの誤りは無いのでしょう
いやその例、完璧にコードの誤りだし。
DebugとReleaseで挙動が違うのは、よくある「間違ってるけどたまたま動いてしまっている」って奴だろ。
それにしても、>>1みたいなくだらないバグを3ヶ月も放置しても平気なんて、
世の中オレが思っているより平和なのかねえ。
そして、これほどの低レベルの奴らが平気でCやC++という危険な言語を触っていることに戦慄するよ。
オレが社長ならこいつらは当分LLしか触らせないけどな。
0131デフォルトの名無しさん
2010/01/11(月) 08:31:280132デフォルトの名無しさん
2010/01/11(月) 08:59:040133デフォルトの名無しさん
2010/01/11(月) 09:43:430134デフォルトの名無しさん
2010/01/11(月) 10:36:34>>1は悪くないじゃん
0135デフォルトの名無しさん
2010/01/11(月) 10:55:22いきなり>>1で「コードは絶対正しいんですぅ!」
解決しても「ぼくの書いたコードじゃないんですぅ!ぼく悪くないんですぅ!」
終始責任逃れに徹して、二束三文の自分のプライドを守ることに執着している。
これによりスレでメモリ破壊を指摘されてもなおも解決できず、時間を無駄に費やした。
さらに俺がSの立場でも、>>1見たいな責任の押し付け合いをするクソ野郎相手には
「何だよバグはお前だろ」「人のせいにするのかよ」っていうわ。
たとえ自分のコードの不具合であっても、足手まといには無駄な作業をさせた方が全体にとって利益だからな。
>>1みたいな奴が開発チームにいたらPM権限発動して隔離部屋で個人作業させるわ。
0136デフォルトの名無しさん
2010/01/11(月) 10:59:280137デフォルトの名無しさん
2010/01/11(月) 11:08:34このスレの人には>>1が>>1の立場で書いた情報しか与えられていないのだから。
そして>>1が他人に責任を押し付けるような奴だってのは周知の事実。
確実に>>1にとって都合の悪い事実が捻じ曲げられている & 隠蔽されているだろうな。
0138デフォルトの名無しさん
2010/01/11(月) 11:13:050139デフォルトの名無しさん
2010/01/11(月) 11:43:260140デフォルトの名無しさん
2010/01/11(月) 13:36:50> なので、Sさんの方に問題があるのではないかと思い、Sさんに原因調査を依頼しました
原因がどちらにあるか切り分けもせず「俺は悪くないからお前のせいだろ!」なんてそりゃ誰でも調査を断るわw
0141デフォルトの名無しさん
2010/01/11(月) 13:42:19お前の責任じゃないから、コンパイラが悪いと主張すればクビにはならないよ。
0142デフォルトの名無しさん
2010/01/11(月) 13:42:220143デフォルトの名無しさん
2010/01/11(月) 13:55:13お前らだって「お前のコードが正しいはずないだろボケ!」と答えるだろ?
0144デフォルトの名無しさん
2010/01/11(月) 14:00:10まったくダメなSだ
0145デフォルトの名無しさん
2010/01/11(月) 14:04:560146デフォルトの名無しさん
2010/01/11(月) 15:19:24だと思っている時点で頭がおかしい
0147デフォルトの名無しさん
2010/01/11(月) 16:42:31int* p;
p=&x;
p[10000]=500;
これもコンパイルはとおるな
0148デフォルトの名無しさん
2010/01/11(月) 16:55:220149デフォルトの名無しさん
2010/01/11(月) 17:22:550150デフォルトの名無しさん
2010/01/11(月) 17:49:070151デフォルトの名無しさん
2010/01/11(月) 17:52:20それはデバッグ版でも動かないだろう
デバッグ版では動いてリリース版では動かない理由を考えないと
■ このスレッドは過去ログ倉庫に格納されています