new/deleteで異常終了する(Visual C++)
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/01/06(水) 20:35:52Visual C++ 2008でコーディングしています。
コーディングは何度も何度も見直しました。
間違っていません。
なのに、実行するとnewで異常終了します。
debug版で動かすと動きます。release版で動かすと異常終了します。
デバッグのしようがありません。
ホントに、コーディングは正しいんです。
こういう症状の原因って何が考えられるでしょうか。
よろしくお願いします。
deleteでも異常終了します。
未初期化ポインタのdeleteとかそんなのではなくて、
本当にコーディングはあってるのに、異常終了します。
動きは、毎回違います。
例えば、printfデバッグをしようとしてprintfを
挿入すると、異常終了ポイントが変わります。
でも、newかdeleteで落ちます。
ホントに、ホントに、コーディングは合ってるのに
どうしようもありません。
もう何ヶ月も仕事が進みません。
このままだと、クビになっちゃいます。
お願いします、本当に、よろしくお願いします。
0132デフォルトの名無しさん
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
0179デフォルトの名無しさん
2010/01/14(木) 19:15:38Visual Studio デバッガ ネイティブ コードのデバッグ
http://msdn.microsoft.com/ja-jp/library/k70yt3e2.aspx
Visual Studio デバッガ メモリ リークの検出と特定
http://msdn.microsoft.com/ja-jp/library/x98tx3cf.aspx
↑のリンク先をよーく読んで
とりあえず_CrtSetDbgFlag()でも入れとけ
0180デフォルトの名無しさん
2010/01/14(木) 20:20:17御託並べてないでさっさとソース晒せよ
0181デフォルトの名無しさん
2010/01/14(木) 21:18:56>>14のコードをC++風に書くとこうなる。
このコードはメモリーリークも多重deleteもメモリ不足も例外も解決する。
template<class T>
class array
{
private:
T* buff;
array(const array&);
public:
explicit array(T* b):buff(b){}
virtual ~array(){delete[] buff;}
T& operator[](int index){return buff[index];}
const T& operator[](int index)const{return buff[index]:}
};
class C1
{
private:
array<int> a;
array<int> b;
array<C2> c;
public:
C1():a(new int[5]),b(new int[5]),c(new C2[5]){};
//各種メソッド
int xxx() ....;
};
0182デフォルトの名無しさん
2010/01/14(木) 21:29:32糞コードw
0183デフォルトの名無しさん
2010/01/14(木) 21:41:030184デフォルトの名無しさん
2010/01/14(木) 22:04:05何でvectorつかわねーんだ
0185デフォルトの名無しさん
2010/01/14(木) 22:09:04>>184 STL版のサンプルよろしく
0186デフォルトの名無しさん
2010/01/14(木) 22:10:40メモリリークする。
多重deleteが防げてない。
例外も防げてない。
メモリ不足?
0187デフォルトの名無しさん
2010/01/14(木) 22:13:22C++BuilderならCodeGuardで一発なんだがな
どうせDebug版にもバグあるよそれ
それがRelease版で顕在化しただけ
0188デフォルトの名無しさん
2010/01/14(木) 22:26:21STL使わない意味ってなんかあんの?
0189デフォルトの名無しさん
2010/01/14(木) 22:35:12>>72
0190デフォルトの名無しさん
2010/01/14(木) 23:00:21C++ with STLも悪くない。Cよりずっと簡単に書けるのに、Cよりそれほど遅くない。
だいぶコードサイズが大きくなるけどな。
だが、C++ without STLは最悪だ。そんなものを使うくらいなら、別の言語を使ったほうがマシだ。
0191デフォルトの名無しさん
2010/01/14(木) 23:14:11C++ With STLが一番じゃん。
昔みたいにCPUもメモリも貧弱だったならともかく
CPU高速メモリあまりすぎの現状速さなんてたいして問題にならん。
0192デフォルトの名無しさん
2010/01/14(木) 23:19:07DSやPSPでSTLバリバリのコード書いたらすぐにメモリはパンクしてしまう。
0193デフォルトの名無しさん
2010/01/14(木) 23:20:40組み込み環境の事も忘れないであげてください。
0194デフォルトの名無しさん
2010/01/14(木) 23:29:43同意
0195デフォルトの名無しさん
2010/01/15(金) 02:24:540196デフォルトの名無しさん
2010/01/15(金) 03:48:100197デフォルトの名無しさん
2010/01/15(金) 05:31:17>>1の返答待ちと言う事で.
WindowsのVCコンパイラが生成した正当なプログラムが
ライブラリの未発見のバグで突然オチることがあるという
のが本当なら結構なニュースバリューがあるし...>>1は
発見者として大感謝されるかも...
0198デフォルトの名無しさん
2010/01/15(金) 08:39:58プロジェクトの設定による違いって事は無いかな?
0199デフォルトの名無しさん
2010/01/15(金) 17:23:580200デフォルトの名無しさん
2010/01/15(金) 23:19:3702011
2010/01/15(金) 23:23:02私は、Windowsにバグがあると言った覚えはありません。
落ちる部分のコードを何度見直しても合ってるのに
それでも異常終了するという症状に困っていると言いました。
実際は、クラスC1を使うプログラムの、クラスC1を使う
部分と全く別のコードが原因でした。
WindowsあるいはVCのバグではありません。
0202デフォルトの名無しさん
2010/01/15(金) 23:32:17コピコンを書かない理由がわからない
0203デフォルトの名無しさん
2010/01/15(金) 23:40:26「コピーすることがないから」は立派な理由だろう。
0204デフォルトの名無しさん
2010/01/16(土) 00:09:06もう最適化やめちゃいなよ
#pragma optimize("", off)
0205デフォルトの名無しさん
2010/01/16(土) 00:13:50その場合、書かない(=デフォルト)のではなく、privateかリンカエラーにするんじゃないか?
0206デフォルトの名無しさん
2010/01/16(土) 00:33:06privateなりにして作っておかないとコンパイラが勝手にpublicで作るよ。
そして誰かがそのオブジェクトのコピーをして死ぬほどめんどくさくなると。
operator=も同上。
0207デフォルトの名無しさん
2010/01/16(土) 01:54:04もし問題が再現する最小のプログラムが書けたらコンパイラメーカが
修正してくれる可能性は大いにあるが、そうでなければ無視される
0208デフォルトの名無しさん
2010/01/16(土) 09:28:21> C/C++コンパイラでコンパイル時に警告が出ているコード
> は既にある程度バグを含んでいるとすら言える。
そこまで言い出すとオープンソースなんかほぼ全滅だろ。
0209デフォルトの名無しさん
2010/01/16(土) 10:25:02UNIX環境の最大の強み。非純正開発環境でmakeして当然出てくる
ワーニングを無視しても殆どが遜色無く動くからオプソが成立
しており膨大な数のソフト資産が形成されてる。
0210デフォルトの名無しさん
2010/01/16(土) 10:54:51まともなプロジェクトならウォーニングはほとんど出ないよ。
オープンソースの場合は、「動けばいい」じゃないから。
0211デフォルトの名無しさん
2010/01/16(土) 11:44:590212デフォルトの名無しさん
2010/01/16(土) 12:20:20boostは完全C++準拠
boostで警告が出るならコンパイラの問題
0213デフォルトの名無しさん
2010/01/16(土) 13:10:49お前はGCCが糞だと言うのか。
だったら何を使えと言うのか?
0214デフォルトの名無しさん
2010/01/16(土) 14:36:29http://www.boost.org/development/tests/trunk/developer/summary.html
まあこれでも見て考えや
0216デフォルトの名無しさん
2010/01/16(土) 20:46:35この人は原因を把握しているのだろうか?
「落ちなくなったから正常に違いない」なんだろうか?
今までは「潜在的なバグがあるが偶然デバッグ版で動いていたがリリース版では動かなかった」で、
今は「潜在的なバグがあるが偶然デバッグ版でもリリース版でも落ちない」ではないだろうか?
最後に聞かせて欲しい。
不具合の原因はなんだったの?
初期化漏れ? コードの誤り?
「全く関係ないところを直したら落ちなくなりました」は原因じゃないですよ。
0217デフォルトの名無しさん
2010/01/16(土) 20:50:07release版で死ぬなら初期化漏れかあるいはメモリ破壊だろ
0218デフォルトの名無しさん
2010/01/17(日) 12:53:270219デフォルトの名無しさん
2010/01/17(日) 13:09:140220デフォルトの名無しさん
2010/01/17(日) 13:54:40プログラム云々より人間関係の信頼構築に失敗している
0221デフォルトの名無しさん
2010/01/17(日) 14:37:230222デフォルトの名無しさん
2010/01/17(日) 15:10:520223デフォルトの名無しさん
2010/01/17(日) 15:22:40そもそもSの書いた部分に原因があるとも、直ったのかどうかすら分からない。
しかも>>1はSに責任を擦り付けるためだけの情報しか書いていない。
0224デフォルトの名無しさん
2010/01/17(日) 16:36:130225デフォルトの名無しさん
2010/01/17(日) 16:46:200226デフォルトの名無しさん
2010/01/17(日) 16:52:110227デフォルトの名無しさん
2010/01/17(日) 21:41:03そんだけボンクラなんだろ。両者とも。
そんなことが許されてるからボンクラなままだとも言える。
0228デフォルトの名無しさん
2010/01/19(火) 00:30:23そいつも一週間は格闘してたな。しかも露見した時の言い訳がひどかった。
参照渡しにするのを忘れたとか何とか。
コピー代入禁止にしとけばすぐに発見できることなのにな。
まあ>>1が同じ事してないことを祈るよ
0229デフォルトの名無しさん
2010/01/19(火) 12:46:20ボンクラ(ボンクラ&)
ボンクラ operator = (ボンクラ&)
02301
2010/01/19(火) 19:58:17どう糞なのでしょう。
大半の方はSTLやスマートポインタを使っていない
から糞だといっているようです。
>>228の方は「>>14みたいなコード」(ダメなコードの意味だと思いますが)の
何がダメなんでしょうか。
0231デフォルトの名無しさん
2010/01/19(火) 20:52:130232デフォルトの名無しさん
2010/01/19(火) 21:19:04何がダメって理由書いたつもりなんだが…
void Test( C1 c ){}
int _tmain(int argc, _TCHAR* argv[])
{
C1 c;
c.init();
Test( c );
return 0;
}
露骨にコピーや代入やってもいいけど、まあ一応>>228の例
C2に空クラスでも実装すりゃコンパイルできるだろ
それと各種メソッドとかいうC1::xxx()をメンバ(a、b、c)にアクセスするように実装して
Test()とreturnの間でC1::xxx()を呼び出してみな
VCならそっちの方がわかりやすいメッセージが出るだろ
何が起こるか予想できるよな?
■ このスレッドは過去ログ倉庫に格納されています