トップページ⇒tech
455コメント137KB

new/deleteで異常終了する(Visual C++)

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/01/06(水) 20:35:52
大変、困っています。
Visual C++ 2008でコーディングしています。
コーディングは何度も何度も見直しました。
間違っていません。

なのに、実行するとnewで異常終了します。
debug版で動かすと動きます。release版で動かすと異常終了します。
デバッグのしようがありません。

ホントに、コーディングは正しいんです。
こういう症状の原因って何が考えられるでしょうか。

よろしくお願いします。

deleteでも異常終了します。
未初期化ポインタのdeleteとかそんなのではなくて、
本当にコーディングはあってるのに、異常終了します。

動きは、毎回違います。
例えば、printfデバッグをしようとしてprintfを
挿入すると、異常終了ポイントが変わります。
でも、newかdeleteで落ちます。

ホントに、ホントに、コーディングは合ってるのに
どうしようもありません。

もう何ヶ月も仕事が進みません。
このままだと、クビになっちゃいます。

お願いします、本当に、よろしくお願いします。
0233デフォルトの名無しさん2010/01/19(火) 22:31:54
>>230
初期化子を使ってないとかnew失敗でNULLが返ってくる前提とか
初期化メゾットをコンストラクタで呼ばないとか
さんざん言われた設計だけでなく実装段階でもクソだ
0234デフォルトの名無しさん2010/01/19(火) 22:41:03
>>1がソース晒さない限り、VC++のバグということで..
また 都 市 伝 説 が一つ増えたというわけだ。
0235デフォルトの名無しさん2010/01/19(火) 23:13:10
クソみたいなコードを量産する前に、
せめてEffective C++ぐらい読んどけ
0236デフォルトの名無しさん2010/01/19(火) 23:53:54
>>1
^^
0237デフォルトの名無しさん2010/01/20(水) 21:50:18
>>232

デバッグ版で動いてリリース版で動かない例にはなってないな
0238デフォルトの名無しさん2010/01/20(水) 22:14:49
ttp://msdn.microsoft.com/ja-jp/library/dykf6bx9(VS.80).aspx
0239デフォルトの名無しさん2010/01/21(木) 00:24:49
>>230
> 大半の方はSTLやスマートポインタを使っていないから糞だといっているようです。
アホすぎる。何が悪いと言われているのに理解できないお前のノーミソなど
味噌糞一緒くたにしてしまえ。そのノークソが一番糞だ。

たまにいるよな、これぐらい酷いアホ。
自分が理解できていないことを理解できないアホは救いようがない。
0240デフォルトの名無しさん2010/01/21(木) 01:03:32
>自分が理解できていないことを理解できないアホは救いようがない。

世の中の殆どの人間がそうなんだが
0241デフォルトの名無しさん2010/01/21(木) 01:06:18
>>1
なんか騒動になってるぞ。株式市場とかにも影響してくるから
釈明の意味でソース晒したほうがいいんじゃね?(情報漏れは
無いようにな)
0242デフォルトの名無しさん2010/01/21(木) 01:38:50
>>241
おまえがその騒動とやらのソースをさらせよ
0243デフォルトの名無しさん2010/01/21(木) 02:30:58
この手のスレはチンパンジーアイちゃんが出てから10程度
でオチるのが常。
しかしこの伸びは異常。やっぱし何かあるからだろな。
0244デフォルトの名無しさん2010/01/22(金) 10:50:24
なんかの手違いで.hと{.obj|.dll|.lib}の不整合が起きてたと予想。
.objや.lib内ではnon-virtualなメソッドが最新の.hではvirtualになってたみたいな。
プリコンパイルヘッダの仕組みを理解せずに使ってたとか、
同じ.hに依存する2つのライブラリのビルドの整合がとれてないとか。
0245デフォルトの名無しさん2010/01/23(土) 01:51:42
れすみないでかくけどはいれつのきょうかいこえてかきこんでるときに
にたようなしょうじょうおこるよね
でばっぐだとあいだにまーじんとってくれるからもんだいおきなかったりするし
printfいれるとうわがきされるいちがかわるからばぐはっしょうするし
はいれつをじさくarrayにおきかえてoperator[]じっそうして
きょうかいちぇっくやったらだいたいつかまるきがする
0246デフォルトの名無しさん2010/01/23(土) 01:56:41
>>1は逃亡したつもりなのかもしれないが...
0247デフォルトの名無しさん2010/01/24(日) 14:54:08
>>233
>設計だけでなく実装段階でもクソ

意味不明
0248デフォルトの名無しさん2010/01/24(日) 15:32:17
「リゾット」あるいは「メゾネット」なら知ってるが、「メゾット」は俺も解らない。
0249デフォルトの名無しさん2010/01/24(日) 18:15:55
おまえらドSだな
0250デフォルトの名無しさん2010/01/24(日) 20:02:24
チンパンジーが何で関係あるの?
0251デフォルトの名無しさん2010/01/24(日) 20:20:36
チンパンジー
0252デフォルトの名無しさん2010/01/29(金) 12:10:34
>>1ですが
やっぱりコンパイラのバグだと思います。
Oilly Debugとかなんとかいうツールで生成コードを
見せてもらった至る所で違ってました
0253デフォルトの名無しさん2010/01/29(金) 13:05:48
それならMSに報告しておいてくれ
次のバージョンでは直してもらえるかもしれない
0254デフォルトの名無しさん2010/01/29(金) 14:07:49
次はムリ。次の次だな。
0255デフォルトの名無しさん2010/01/29(金) 14:14:24
>>1
VCなどのコンパイラに感染するウィルスがあるって噂
を聞いた事ががあるんで、ウィルスチェック。
そんじょそこらのウィルスチェッカーじゃ弱くて
OSをインストールした直後で一切ネットに繋げていない
状態で、インストール元CD−ROMのパッケージを全部
こじあけてHDに展開して、すべてのファイルについて
MD5をとっておく。
(MD5データのみUSBメモリに保存しておく)
開発マシンの同名ファイルのMD5を取って比較する。
出来ればMD5だけじゃなく他のその手のチェックサム
を合わせて取って比較チェックしたほうがいいかも
0256デフォルトの名無しさん2010/01/29(金) 16:54:32
このバグ既に報告済みだから
0257デフォルトの名無しさん2010/01/29(金) 20:59:32
その生成コードとやらの掲載よろしく
0258デフォルトの名無しさん2010/01/31(日) 22:55:15
>>1
とりあえず収拾してくれ
0259デフォルトの名無しさん2010/02/02(火) 07:18:39
この手のバグは配列(ポインタ)のインデックス不正で起こることがとても多い。
0260デフォルトの名無しさん2010/02/02(火) 08:58:43
>>259
本当はそうかもしれないけど、他人のコードがおかしいとケンカ売っている以上
もう、「ごめん、僕のミスだった」じゃ済まない。
だから、コンパイラのエラーにするしかなかったんだと思う。
特定のコンパイラだと運よく動くなんてことはままあるのだけど。
0261デフォルトの名無しさん2010/02/02(火) 10:30:42
再現コード込みで文句言えない時点で騒いでる方のミス。
と俺は思ってる。

本当に問題あるのなら食わせたソースと吐いたアセンブラ突き合わせて説明できるはず。
0262デフォルトの名無しさん2010/02/02(火) 20:58:21
アセンブラは吐かないだろ…
0263デフォルトの名無しさん2010/02/02(火) 23:15:06
コンパイラのバグだったらアセンブラ吐かせて説明できるはずってことでしょ
026412010/02/03(水) 00:08:18
随分日にちがたってしまいました。
アクセス規制にかかっててずっと書き込めませんでした。

ちなみに、>>252は私ではありません。

あと、皆さんのコメント見ててちょっと思ったんですが、
クラスの値渡しってまずいんですか?

そういうプログラムを普段書かないから分からないんですが、
0265デフォルトの名無しさん2010/02/03(水) 00:15:43
>>264
値渡しは出来る(と思う)が、当然だがクラスへの変更操作は
呼び出し元には反映されないので、同一オブジェクトへの2つ
のバージョンが出来てしまうことになり多くの場合に問題が発生する
ので、通常はポインタ渡しにする。
VCの場合、プリコンパイルドヘッダ周りが結構悪さをして
予期せぬ不具合を作る場合がある。ビルドする際には
面倒でも中間ファイルを削除する習慣を付けたいもの
(その代わりビルドの時間が多少犠牲になる)
0266デフォルトの名無しさん2010/02/03(水) 00:46:23
またVCバグ説w
0267デフォルトの名無しさん2010/02/03(水) 00:49:19
>>264
コピー&代入がおかしいって既に数人が指摘してんじゃん
0268デフォルトの名無しさん2010/02/03(水) 03:17:05
>>264
コピー、代入がしっかり設計されているクラスならば値渡しは問題にならない。
ただ効率の問題が別にあるがそれ自体はバグではない。
おまえの作った>>14のクラスをコピーや代入するとバグる。値渡しはその一例にすぎない。
二重deleteでヒープを破壊するからな。
もしお前がコピーや代入をたまたましていなくて問題がなかったとしても
>>14のクラスを他人が使う可能性があるとしたらやばいな
まあ他にも複合的な問題はありそうだけどな
0269デフォルトの名無しさん2010/02/03(水) 04:14:40
なんでコピーコンストラクタや代入演算子を自前で書かないのかわからない
クラス内でnew/de;eteするクラスは自前で書くのが当たり前だろ
0270デフォルトの名無しさん2010/02/03(水) 04:59:39
>クラスの値渡しってまずいんですか?
こういうレベルの人に C++ コードを書かせる時点で間違い
0271デフォルトの名無しさん2010/02/03(水) 05:04:52
入門書レベルの質問じゃね?
0272デフォルトの名無しさん2010/02/03(水) 05:25:40
あくまでも自分は悪くなく、コンパイラのバグだと言い張る奴は
いつまで経ってもバグが取れない
0273デフォルトの名無しさん2010/02/03(水) 07:08:45
永久にとれるはずがない。
そいつが開発をしていること自体がプロジェクトのバグだからな。
0274デフォルトの名無しさん2010/02/03(水) 13:51:32
「よくわかんないけど動いたのでこれでいいです」
これで許される環境がウラヤマシスギルw
0275デフォルトの名無しさん2010/02/03(水) 15:09:43
まあ、許されてしまう所にいた結果、こんなことに
なってしまうんだろうなあと思う。
0276デフォルトの名無しさん2010/02/03(水) 19:01:59
俺が上司なら、上を説得してそいつのコード全部を廃棄するレベル。
0277デフォルトの名無しさん2010/02/03(水) 20:59:39
絶対に許さないよ
0278デフォルトの名無しさん2010/02/05(金) 23:22:04
値渡しがコピーを発生させてしまうことを知らない
いや、そもそもコピーコンストラクタと代入演算子を知らないんじゃね?
0279デフォルトの名無しさん2010/02/05(金) 23:50:36
もっと恐ろしい奴は、起こることを知っていても
それがどういう意味を持つのか理解できない奴。

確実に>>1はその類。
0280デフォルトの名無しさん2010/02/06(土) 04:28:56
自分でnew/deleteせずにstl使ってれば
デフォルトのコピーコンストラクタと代入演算子で上手く行くのにね
0281デフォルトの名無しさん2010/02/06(土) 08:36:02
えっ
0282デフォルトの名無しさん2010/02/06(土) 12:05:50
>>280
こういう中途半端な知ったかが、プロジェクト内に害悪コードをまき散らす。
0283デフォルトの名無しさん2010/02/06(土) 12:46:04
「C++はポインタがあるから不安定」とか抜かして
Java/C#を使ってぬるぽで頭を抱えている奴と同類だなw
0284デフォルトの名無しさん2010/02/06(土) 13:03:03
問題の原因を追求せずに回避策ばかり論じる奴もバグの温床
0285デフォルトの名無しさん2010/02/06(土) 13:55:59
>>283
そーいう連中はしねばいいのに。
0286デフォルトの名無しさん2010/02/06(土) 18:25:25
>>280が何を言いたかったのかさっぱりわからない
0287デフォルトの名無しさん2010/02/06(土) 22:19:31
多分このスレの頻出単語適当につなぎ合わせてそれっぽい文章をつくるスクリプトだよ
0288デフォルトの名無しさん2010/02/08(月) 17:46:21
このスレなんでこんなに人気あるんだ?
0289デフォルトの名無しさん2010/02/08(月) 18:03:35
ぬるぽの方がマシかと
0290デフォルトの名無しさん2010/02/08(月) 19:10:21
>>1は早くソース晒せw
0291デフォルトの名無しさん2010/02/08(月) 20:27:21
>>290
そんな。ソース出したら間違いが分かっちゃって、先輩のせいにできないじゃないですか!!!
もう、コンパイラのせいでいいんです。
0292デフォルトの名無しさん2010/02/08(月) 21:40:52
>>14でC1のインスタンスを値渡ししちゃったんでしょ
029312010/02/11(木) 17:18:44
ここの方々の書き込みのお蔭でだいぶ勉強になってます。
ありがとうございます。

コピー、代入に話が集中してきていますが、
今回の不具合とは関係ないです。

クラスC1がコピーできないのはその通りえすが、
コピーや代入を前提としてないので大丈夫です。
0294デフォルトの名無しさん2010/02/11(木) 18:20:09
ソース無しで議論させるの?
0295デフォルトの名無しさん2010/02/11(木) 18:22:13
C++がわかる>>1はすごい
0296デフォルトの名無しさん2010/02/11(木) 20:48:56
コピーや代入は前提としてないので(キリッ
0297デフォルトの名無しさん2010/02/11(木) 21:20:56
>>293
あんたプログラムやめて真剣に他の生き方を模索した方がいいと思うよ
0298デフォルトの名無しさん2010/02/12(金) 00:36:19
>前提としてないから大丈夫
じゃああらゆる不具合も前提としなければ大丈夫
0299デフォルトの名無しさん2010/02/12(金) 04:20:19
>>28
会社都合の方が条件良いよ。
0300デフォルトの名無しさん2010/02/12(金) 12:41:44
値渡ししたらコピーが発生するんだが
0301デフォルトの名無しさん2010/02/12(金) 12:44:39
もう放っとけよ
こいつがどうなろうと俺には全く関係がないし
0302デフォルトの名無しさん2010/02/12(金) 13:02:10
>>301
でも、実際、ある日突然新米プログラマーが
「2chであなたのプログラムがおかしいという結論になった」
とか言いがかり付けてきたときのケーススタディにはなると思うよ
0303デフォルトの名無しさん2010/02/12(金) 13:34:17
そもそも値渡しなんか使わない
普通はポインタか参照を渡す
0304デフォルトの名無しさん2010/02/12(金) 14:27:21
他人のコードまで制御できるか?
できるなら実装で禁止するべきだし、そうでなくてもドキュメントに書いて仕様とする必要はあるだろ
0305デフォルトの名無しさん2010/02/12(金) 15:13:33
コピーコンストラクタと代入演算子が使えないようにしとくべきだとは思います
0306デフォルトの名無しさん2010/02/12(金) 15:18:51
noncopyableただしmovable
0307デフォルトの名無しさん2010/02/13(土) 05:49:41
値渡ししてるのかしてないのか知らんけど
何らかの暗黙のコピーが発生してるんじゃないかって話じゃないのか?
前提としてないから大丈夫って答えからするとまともにチェックしてなさそうだが
オレも実装で禁止すべきだと思うよ。
他人が誤使用してしまったら終了じゃん
0308デフォルトの名無しさん2010/02/13(土) 07:22:32
>>304
他人が誤用しないようコードで抑えるのは当然として、
他人のコードであろうとコードレビューで品質を抑える。
レビューですら抑えられないレベルのバカのコードは黙って捨てる。

まぁそもそも>>1の言っていることだから、本当にSが原因だとは限らないがなw
0309デフォルトの名無しさん2010/02/13(土) 10:42:57
どうやって禁止するの?
0310デフォルトの名無しさん2010/02/13(土) 10:53:26
access specifierで禁止する。
0311デフォルトの名無しさん2010/02/13(土) 12:58:12
大元のバグの原因になっているクラスのコピーコンストラクタと
代入演算子さえ正しく書けば動くんじゃないの?
0312デフォルトの名無しさん2010/02/13(土) 23:48:36
コンストラクタ&コピーコンストラクタ&=オペレーターで
全メンバを 順次 初期化は基本中の基本
0313デフォルトの名無しさん2010/02/14(日) 02:18:30
boostにnoncopyableなんてあるのな
0314デフォルトの名無しさん2010/02/14(日) 10:07:13
>>313
必ずしもそれは使わなくてもクラスに次の3行

private:
A(const A&);
A& operator=(const A&);

を付け加えるか(もちろんAは実際のクラス名に変更)これを継承すれば
コピー不可能になるよ
0315デフォルトの名無しさん2010/02/15(月) 05:56:26
可読性が高いのはどっちかね
0316デフォルトの名無しさん2010/02/15(月) 11:47:24
boostを使えない現場では>>314のようなテクを使うしかないだろう
仕事でboostが必ず使えるとでも思っているのか?
0317デフォルトの名無しさん2010/02/15(月) 12:08:02
あああともう一つ
>>314だけを入れたクラスをnoncopyableという名前で宣言しておき、
これを継承すればboostと同じ事になるから可読性が下がるという
事はない
0318デフォルトの名無しさん2010/02/15(月) 12:45:46
俺は生が好き
0319デフォルトの名無しさん2010/02/15(月) 14:21:00
>>316
boost使えても、普通は>>314。
0320デフォルトの名無しさん2010/02/16(火) 22:31:58
>>319
んなこたない。

例えば WebKit では Noncopyable というクラスを自前で用意してそれを使っている。
http://trac.webkit.org/browser/trunk/JavaScriptCore/wtf/Noncopyable.h
0321デフォルトの名無しさん2010/02/16(火) 23:44:56
ライブラリやフレームワークが提供するものを指して
自前で用意するっていうのか?
0322デフォルトの名無しさん2010/02/17(水) 08:28:45
boost脳はいいかげんにしてほしい
0323デフォルトの名無しさん2010/02/17(水) 08:30:09
じゃあはやく0x使わせろよ
0324デフォルトの名無しさん2010/02/17(水) 11:34:53
>>320
んなことないこたない。
一段階余分なものがあると、それを知らない奴はその内容を調べないとならないだろ。
手間がかかるわけじゃなし、>>314が最良だろ。
0325デフォルトの名無しさん2010/02/17(水) 17:09:58
>>314だと、「こんなのあるからコピーができないんだ!」とかいって、
いつのまにか誰かに修正されちゃうかもしれないだろ。w
0326デフォルトの名無しさん2010/02/17(水) 17:16:49
>>325
糞吹いたw
0327デフォルトの名無しさん2010/02/17(水) 17:19:35
C++を使うのが間違い
C#かJavaを使うべし
0328デフォルトの名無しさん2010/02/17(水) 20:42:28
>>326
マジで派遣にそれをやられたことがある。
「事前条件チェックするな!実行したら落ちたろ!」と逆ギレされたこともある。
「constなんて使っているバカは誰だ!コンパイルが通らないだろボケ!!」には参った。

仕組みとして防ぐのがベスト、しかも明示的に書くのが理想だが、残念ながらアホには通じないw
0329デフォルトの名無しさん2010/02/17(水) 21:01:36
随分態度のでかい派遣だな
0330デフォルトの名無しさん2010/02/18(木) 00:25:53
アホっていうか
派遣にしろプログラマにしろ
そんな危なっかしいのはとてもじゃないけど雇ってられないな

フレームワークやシステムの思想を独断で破られるとか後が大変だぞ、、
0331デフォルトの名無しさん2010/02/18(木) 00:43:25
>>324
Noncopyable という名前を見て意図を察することのできない奴はよっぽどの痴呆
万が一コードを見に行ったとしても20秒で読み終わるぞ

似たようなコード片をあちこちにばら撒くよりはミスの可能性が減るし、やっておいて損はない
0332デフォルトの名無しさん2010/02/18(木) 11:09:48
boost脳はいいかげんにしてほしい
■ このスレッドは過去ログ倉庫に格納されています