new/deleteで異常終了する(Visual C++)
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/01/06(水) 20:35:52Visual C++ 2008でコーディングしています。
コーディングは何度も何度も見直しました。
間違っていません。
なのに、実行するとnewで異常終了します。
debug版で動かすと動きます。release版で動かすと異常終了します。
デバッグのしようがありません。
ホントに、コーディングは正しいんです。
こういう症状の原因って何が考えられるでしょうか。
よろしくお願いします。
deleteでも異常終了します。
未初期化ポインタのdeleteとかそんなのではなくて、
本当にコーディングはあってるのに、異常終了します。
動きは、毎回違います。
例えば、printfデバッグをしようとしてprintfを
挿入すると、異常終了ポイントが変わります。
でも、newかdeleteで落ちます。
ホントに、ホントに、コーディングは合ってるのに
どうしようもありません。
もう何ヶ月も仕事が進みません。
このままだと、クビになっちゃいます。
お願いします、本当に、よろしくお願いします。
0079デフォルトの名無しさん
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それはデバッグ版でも動かないだろう
デバッグ版では動いてリリース版では動かない理由を考えないと
0152デフォルトの名無しさん
2010/01/11(月) 18:02:250153デフォルトの名無しさん
2010/01/11(月) 18:42:510154デフォルトの名無しさん
2010/01/11(月) 22:19:35変数はちゃんと初期化してからつかおーね
0155デフォルトの名無しさん
2010/01/11(月) 22:29:05char s[100];
printf("(´ー`)%s", s);
↓
(´ー`)フフフフフ…
0156デフォルトの名無しさん
2010/01/12(火) 02:58:40前々から噂にはなっては消えてる話だろ?
VC(.NETになる前)のmalloc辺りに問題があって
alloc/deallocを数十億回繰り返してフラグメンテーションが
発生すると落ちる場合があるって噂
嘘くさいと思ってる(メモリデフラグソフトがデビューしだした
頃の噂だから)
0157デフォルトの名無しさん
2010/01/12(火) 03:11:12ネットがADSLになって普及した2000年代前半の頃
盛んにホットフィックスが行われたが少なからず
メモリ周りのセキュリティーホールフィックスが
行われたらしいがその際にバグが混入したとかしなかった
とか聞くね。そのせいかどうか知らんが、ウチの会社では
端末も基幹もWindowsだけど、端末から基幹のほうには
telnetでしか接続出来なかったりしてる(端末はしっかり7
が入っているが、基幹は未だにWindows NT4.0 Server )
0158デフォルトの名無しさん
2010/01/12(火) 05:25:080159デフォルトの名無しさん
2010/01/12(火) 07:29:43勝手にスワップしてデフラグされるの?
0160デフォルトの名無しさん
2010/01/12(火) 08:06:45ここでのフラグメンテーションは、プロセスメモリ空間上での
話で要するにmalloc/freeなどのライブラリヒープマネージャー
が管理する情報が混乱した状態になる事だろ。
VCみたいなメイジャーなコンパイラとかじゃまずありえないん
じゃね?
0161デフォルトの名無しさん
2010/01/12(火) 08:18:380162デフォルトの名無しさん
2010/01/12(火) 08:34:44否、気にすべきで、コード記述に便利だからとか奇麗だから
という理由だけでC++とかで安直にクラスの下にクラスを
何層にもぶら下げてるような設計にしてたりすると
new/deleteの回数が増えて、ヒープマネージャに負荷がかか
って、デーモンとかサービスのように途中終了する機会がなく
長時間動作させるようなアプリではシステムによっては、
パフォーマンスが突然滅茶苦茶落ちてフリーズ状態になる
可能性がある
と昔、習った。
0163デフォルトの名無しさん
2010/01/12(火) 17:43:09可能性があるだけですね?
どのみちWindowsUpdateで再起動するし問題ないですね
0164デフォルトの名無しさん
2010/01/13(水) 03:04:33は早くソース晒せ
0165デフォルトの名無しさん
2010/01/13(水) 05:20:02>telnetでしか接続出来なかったり
セキュリティも糞もねぇなw
0166デフォルトの名無しさん
2010/01/13(水) 05:24:58何をトンチキなことを…
アプリケーションがポインタ直接保持してんのに
勝手に移動されたらどーすんだよ。ハンドルならいざ知らず。
0167デフォルトの名無しさん
2010/01/13(水) 06:01:25PuttyとかTera-SSH使っているとでもいいたいんだろ
0168デフォルトの名無しさん
2010/01/13(水) 16:39:29区別するっつーのwどういう職場なら区別しないんだ。
telnetはtelnet。sshはsshだ。
0169デフォルトの名無しさん
2010/01/13(水) 17:57:54Telnetと区別しないで伝統名称Telnetと
呼ぶ職場も多いね。
んなことよりもソース晒さないの?
01701
2010/01/13(水) 22:03:16>>126,>>164
申し訳ございませんが、コードのアップは控えさせて下さい。
それに、今回の問題の本質は、コードがどうだったかよりも、
異常終了するコードの箇所と全く違う部分のコードが原因と
なっていることもあり、そのような場合にプログラマはどう
デバッグすればいいかと言うことだと思います。
>>127,>>151
デバッグであってもリリースであっても、動かない場合は
基本的にはコードに問題があると思っています。変数の
初期化や配列インデックス値の不正はよくあるミスです
ので注意しています。デバッグ版の場合はデバッグ用の
領域が広くとられているため、バグが表面化しない場合が
あるということなんだろうと思います。
>>128
どう糞なのか教えてください。
14で示したコードはnewやdeleteで落ちるものだから、
その部分の概要が分かるように簡略化して書きました。
それとも、STLやスマートポインタを使ってないことが
糞なのでしょうか。
0171デフォルトの名無しさん
2010/01/14(木) 01:12:350172デフォルトの名無しさん
2010/01/14(木) 02:37:15言い訳するなら俺らに対してじゃなく会社にすべきだよね。まあどうでもいいけど
0173デフォルトの名無しさん
2010/01/14(木) 03:50:44>デバッグすればいいかと
まともな人ならちゃんとデバッガ駆使します。
0174デフォルトの名無しさん
2010/01/14(木) 04:21:03Windowsマシンは安価故、大量生産されて世のPCの95%以上がWindowsマシンであることは一般常識であることは言う迄もない
が、それらは決定的に重要なところに使われているわけでもない
が故に、バグがあると影響がゆっくりと現れて、数が多いが故に
中々取れないんで、バグの存否情報は大きな社会問題に発展する
可能性を秘めている。
会社と君の関係の問題も重要だがWindowsの重要なライブラリの
バグではないかという主張を公開ネット上で一つのスレを使って
主張した以上、多少時間がかかってもいいからその状況を可能な
限り忠実に再現できるファイルセットをアップして真相が決定で
きるようにして欲しい。もちろん君がどの会社のどの部署に
所属しているのか絶対にわからないように変数や関数の名前を無
意味な英数字にするとかそういう工夫は必須だしそうしても貰わ
ないとこの板の住人にも迷惑がかかる。
0175デフォルトの名無しさん
2010/01/14(木) 08:31:07知識の不足なんてさして問題じゃない。
察しの良い奴ならすぐに学習するからな。
メモリ破壊を指摘されても「僕悪くない!!」に徹した
技術屋としては最低最悪な外道だから糞なんだよ。
0176デフォルトの名無しさん
2010/01/14(木) 09:10:13コードの話をしてるんじゃなかったのか?w
0177デフォルトの名無しさん
2010/01/14(木) 13:03:29どういうことをしていて、newで落ちてたようだ、ということだけでも書いていただければ、勉強になるんですが。
はっきりしないんでしょうかね。
0178デフォルトの名無しさん
2010/01/14(木) 13:04:56>>43
■ このスレッドは過去ログ倉庫に格納されています