1 名前:デフォルトの名無しさん mailto:sage [2012/05/08(火) 04:55:24.99 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part94 toro.2ch.net/test/read.cgi/tech/1329512856/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.78【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1331894668/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
407 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 22:21:29.08 ] >>405 de;ete[] new int[0];で異常終了が合法なの? りょうかーい。
408 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 22:25:00.40 ] 大抵は盛大にリークしまくりモードで焼け牛に水状態なんだけどな。 実装によっては開放した途端OSにボッシュートされてヨソにもってかれたりとかも。
409 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 22:29:37.55 ] Windows Me以前か、Windows以外のOSか? 基本的に ヒープが空 = アドレス空間に空きがない であって ヒープが空 = システムの記憶領域が足りない じゃないからな。後者だとプログラム以前にOSが止まる。
410 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 22:30:27.97 ] >>407 ちゃうねん。異常終了しないのが合法。
411 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 22:31:42.59 ] 焼け牛…そういえば、牛に衝突すると「モー」となくドライビングゲームがあってだな…
412 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 22:58:10.60 ] 若干スレチですが、 cmathのrand()って周期いくつか分かりますか?
413 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 23:00:29.78 ] 若干スレチですが、 cmathのrand()って周期いくつか分かりますか?
414 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 23:03:46.58 ] 2分弱かな・・・。
415 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 23:15:26.42 ] >>413 そんなもの存在しない
416 名前:デフォルトの名無しさん mailto:sage [2012/05/27(日) 23:26:07.12 ] C++11ならMT19937が装備されたじゃん
417 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 00:05:41.96 ] >>413 cmathの中にrandはない。他の場所にあるrandの周期は実装によって異なる。
418 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 00:15:04.79 ] randの仕様見たけど、ほとんど仕様ないんだな
419 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 00:24:54.98 ] 線形合同法だったり、なんかビット操作して128bit周期にしてみたりとか色々実装があるね。
420 名前: ◆QZaw55cn4c mailto:sage [2012/05/28(月) 03:46:04.96 ] 最近のはやりは、それでも基本線形合同、ただし表に返すのは上から半分
421 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 05:52:39.32 ] それは仕様がない
422 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 10:47:20.39 ] 土日に盛り上がってたんだな・・・ >>361 RAII(スマポ)使うかtry-catch(-rethrow)するか2択なんだし 両方しないのは単なる例外安全でないバグコードじゃね Fooがバグってるのに Foo「俺のせいじゃないです、bad_alloc投げたやつせいです」 それあんまりじゃね
423 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 12:00:15.12 ] >>403 どうしようも無いケースも多いだろうけど オンメモリで小さいテキストを処理する機能にクソでかいファイル渡すとか オプションで何かのバッファサイズに無茶な値を設定したとかあるし 対話型なら別にプロセス落とさなくても 入力ハンドラあたりでcatchしてエラー表示して続行でよくね
424 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 12:34:04.34 ] まったくだ。数ある「例外処理したくない」言い訳のひとつだろ。
425 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 14:26:54.15 ] >>423 画面表示もメモリ食うんじゃないのか?
426 名前:デフォルトの名無しさん mailto:sage [2012/05/28(月) 18:21:20.59 ] >>425 >>423 の2,3行目のケースならメモリ大量消費処理から 入力(\nやマウスイベント)ハンドラまでスタックが戻った時点で メモリは解放されてる(例外安全なコードなら) 戻って尚足りないなら、どうしようも無いケースってことで
427 名前:デフォルトの名無しさん mailto:sage [2012/05/29(火) 09:45:22.55 ] リソースが厳しい組み込み系以外で、 コンパイラオプションで例外を無効にしてる人っている?
428 名前:デフォルトの名無しさん mailto:sage [2012/05/29(火) 13:24:28.38 ] >>427 Google社員がそうじゃね?
429 名前:デフォルトの名無しさん mailto:sage [2012/05/29(火) 21:19:59.03 ] PSP、DS、360、Wii全部例外切ってやってた
430 名前:デフォルトの名無しさん mailto:sage [2012/05/29(火) 21:59:51.13 ] >>429 コンパイラー何使った?
431 名前:デフォルトの名無しさん mailto:sage [2012/05/29(火) 22:52:35.80 ] CODE WARRIOR
432 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 01:10:25.39 ] >>429 427 じゃないけど、なんで切ったのか気になるなー。 プログラムサイズ?実行速度?
433 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 04:20:14.38 ] >>431 それはコンパイラーじゃなくて統合開発環境じゃん。てのは置いといて、 CodeWarriorについて来るコンパイラーは、そもそもthrow-try-catchが まともに動かんだろ。
434 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 07:38:21.36 ] 例外切るとstd::stringやstd::vectorとかも実質使えないから ベターCとしてのC++になるのかな
435 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 08:05:44.79 ] STLも使えなくなるな いやまて例外を投げるメンバ関数だけ切ればいい話か
436 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 08:28:18.20 ] クラスのポインタって実体はあるの? class sub{ public: int aaaa; }; claaa sper{ public: sub* s; }; ↑特にこういう時
437 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 08:37:44.75 ] メンバへのポインタあるだろ (sub::**s)になるのかな
438 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 08:38:14.93 ] あ、ただしこれは単独では使えないからね インスタンスと組み合わせて使わないと意味をなさない オフセットのようなものか
439 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 08:46:53.93 ] sperをインスタンス化してもsubは不定かNULLポインタだな。
440 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 08:50:28.22 ] それはコンストラクタの初期化リストか他のメンバ関数でnewするしかないね 他の配列やPODなんかを指しても別にいいけど ただクラスはstaticメンバでない限り多数生成する目的なんだからやはりnewだろうね そしてデストラクタにはdeleteを入れる スマポを使うと楽だけどな
441 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 08:52:29.69 ] オブジェクトを作って配下の変数やクラスにもデータを入れているのに 初期化関数を抜けたらポインタで持たせているデータだけNULLになっていました。 char*とかがそうです。中身を持たせているのにも関らず消えてしまうのはなぜなんでしょうか?
442 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 09:00:09.20 ] 具体的に書いてみろや 文章だけじゃイメージ沸かない
443 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 09:17:17.40 ] >>436 こんな感じかなあ class sub { public: int aaaa; }; class sper { public: sub* s; }; int main() { sub* su = new sub; sper* sp = new sper; sp->s = su; int sub::*aa = &sub::aaaa; su->*aa = 1; std::cout << su->*aa << std::endl; sp->s->aaaa = 2; std::cout << su->*aa << std::endl; delete sp; delete su; }
444 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 09:42:39.53 ] クラスの配列をコンストラクタで初期化することってできますか? class test{ public: cObj* objArray[10]; test() : objArray[0](new cObj) {}; }; みたいな感じなんですが・・・・・
445 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 09:50:21.49 ] >クラスの配列をコンストラクタで初期化することってできますか? できる。
446 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 09:56:04.82 ] >>445 どうやって?
447 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 09:58:31.43 ] やればできる できないと思った瞬間にゲーム終了だ
448 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 09:58:34.74 ] >>445 それできるのか? 知らんかった
449 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 10:05:05.19 ] newしたオブジェクトをdeleteする際に下のエラーが出て困っています。 どうしたらいいか教えてください。 HEAP[hoge.exe]: Invalid Address specified to RtlFreeHeap( 00000000, 00000000 ) Windows によって hoge.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。hoge.exe または読み込まれた DLL にバグがあります。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
450 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 10:19:59.96 ] ソースを示せ nullをdeleteしてるんだろ
451 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 10:23:54.40 ] >>444 デフォルトコンストラクタでいいならvectorにでも突っ込めばいいけどな
452 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 10:41:58.15 ] >>449 地道にデバッグするしかない 書いちゃダメなところに書いてる 多くの場合、配列の添字かポインタが意図しない値になってる
453 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 10:51:41.49 ] >>450 無理! 超雑だし、吐き気を催すだろうからww >>452 なるほど・・、取りあえずやってみます。
454 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 10:57:58.23 ] 答え:雑だから
455 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:04:26.07 ] >>454 明日から背中に気をつけろよ
456 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:13:47.59 ] ソースも出せないカスプログラムをデバッグさせられるのは嫌だ
457 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:25:43.53 ] どっちにしろって所だけどな カスだろうがカスじゃなかろうが、カス扱いは確実だろう やりたくなきゃやらなきゃ良い
458 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:32:25.52 ] 心のさけびをぶっぱされても・・・
459 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:40:58.92 ] 動的メモリ確保でいいならアライメントを解決した領域に単純なplacement new、 それが嫌ならaligned_storageから作れるスタック領域にplacement newをforなりwhileなりの 繰り返し構文で回せばできるだろ。
460 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:43:19.03 ] sizeof使った部分特殊化で重複定義を回避する方法って何か無いですかね? ideone.com/Axkqv ideone.com/k4arh ideone.com/7vhhV
461 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:43:25.50 ] 自分でnewしたものをdeleteできないなんてプログラマとしてどうなんだ
462 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:46:14.46 ] おとなしくスマートポインタ使えよ。
463 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 11:56:39.78 ] >>460 mpl::mapを使えばできる。 ちょっと待っててね。
464 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 12:18:14.76 ] >>460 できたよー(^o^)ノ ttp://ideone.com/pkiS4
465 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 12:35:47.70 ] またnullをdelete出来ないと思ってるアホが居る…
466 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 12:35:57.38 ] >>464 ありがとうございます template<int n>にして目的のものが出来ました
467 名前: ◆QZaw55cn4c mailto:sage [2012/05/30(水) 12:41:05.43 ] free(0)はOKなんですけど、delete はだめなんですか?
468 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 12:45:23.75 ] delete nullptr; は何ら間違ってはいない。 前規格だと delete NULL; かな。
469 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 18:35:27.65 ] ソースも出さずにデバッグ出来るのはエスパーだけ 元のソースが秘密で出せないのならせめて症状が再現する最小のプログラムだけでも 示してくれないと何も出来ないから
470 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 18:57:32.46 ] 質問の意図や前提をくみ取れない糞質問 が多い。それで回答者が逆質問をしたり 悪口を言ったりする。それを前もって思 い描く力が絶望的に欠如してるに違いない。 スーパーハッカーだけが意図を理解できる。 レアなそういう神が颯爽と登場する予感。
471 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 19:47:02.72 ] >>468 NULLじゃなくて0じゃね? NULLは、Cとの互換で残ってて 元々非推奨だし
472 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:19:34.26 ] NULLが非推奨って何の話だ
473 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:24:15.21 ] 0がNULL扱いになった頃の話
474 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:24:50.01 ] 逆じゃね?
475 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:29:53.11 ] ネットじゃ文章が見当たらんけど NULLだと、0だということがぼやけるから という事だったハズ
476 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:36:29.39 ] #define NULL (void*)~0 0がぼやけるってのを補足するとNULLだと別に 0じゃなくてもいいんだけど、C++じゃdynamic_castとか deleteとか無効アドレスとして0を前提とした 言語機能があるもんで、NULLだと値が不定でマズイ
477 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:39:30.91 ] 4.10 Pointer conversions [conv.ptr] 1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type. Two null pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification conversion (4.4). JIS-X3014 4.10 ポインタ変換 ゼロと評価される右辺値を持つ整数型の汎整数定数式(5.19)を、空ポインタ定数と呼ぶ。空ポインタ定数 は、ポインタに変換する事ができる。その結果は、その型の空ポインタ値となる。空ポインタ値は、オブジェクト先 ポインタ型 又は 関数型ポインタ型のどんな値とも区別できる値とする。同じ型の二つの空ポインタ値は、 比較で等しくなるものでなければならない。空ポインタ定数から、cv修飾付きの型へのポインタの変換は、 単一の変換となり、ポインタ変換の後で修飾変換(4.4)を行うことはできない。 C++ではCと違い、void*を任意のポインタに代入する場合には明示的なキャストをしなくてはならなく なったためにvoid*を使うメリットがなくなったという話 しかし単なる 0 をヌルポインタなのかdouble型の0.0なのかコンパイラが判別出来ないためにまだ問題が 残ったので、C++11ではnullptrを新設した
478 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:42:10.74 ] >>477 C++98とかそんな最近の話じゃないぞ
479 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:44:03.62 ] >>478 ISO/IEC 14882:2003だぞ
480 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 20:48:17.83 ] >>479 98年以前から言われてた話だってこと そっからすると2003は最近でしょ あと、仕様が出来た理由と非推奨の話は別だからね 仕様書に書いてる話じゃなく禿のコラムとかそっちに 書いてあった内容だから
481 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 21:01:09.85 ] www.libjingu.jp/trans/bs_faq2-j.html#null 標準化前というとiostream.hとかの時代かなあ
482 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 21:15:42.11 ] >>434 例外切ってるけどstd::stringやstd::vectorはフルに使うよ。何かまずいの?
483 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 21:43:54.88 ] >>480 D&Eの日本語版のP291から書いてあるな
484 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 23:01:04.82 ] >>482 中でメモリ確保失敗したらどうすんの?
485 名前:デフォルトの名無しさん mailto:sage [2012/05/30(水) 23:12:10.31 ] >>484 メモリ確保失敗しないように作る。ゲーム開発では普通のこと
486 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:04:33.51 ] >>485 そりゃ製品はそうなるだろうけど、開発中には失敗しちゃうこともあるでしょ。 呼び出し元でチェックとかできないわけだけど、どうすんの? わけわかんない動作が起こってから調べに行くの?
487 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:13:37.94 ] >>486 なぜ呼び出し元でチェックできないのかよくわからんけど
488 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:17:11.33 ] NULLチェックすりゃいいじゃんね
489 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:25:19.96 ] new (nothrow) 使うんだろ
490 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:27:53.20 ] >>487 vectorの中のメモリ確保失敗は標準C++ではbad_allocなんかの例外で通知されるんだけど、 例外無効にしてる状態で呼び出し元でチェックしようとしたら何かしら標準以外の方法を使うことに なるんじゃないの? >>488-489 vectorやstringではそうはいかないでしょ。
491 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:29:39.31 ] >>490 例外未対応の処理系ならabortへ直行
492 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:35:15.99 ] GoogleならSTLに頼らない独自の配列クラスとか作ってるらしい
493 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:44:25.22 ] >>491 やっぱそうか。ありがとう。
494 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:45:33.18 ] まあヌルポにアクセスしちゃうからね
495 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:46:14.25 ] >>476 んなこたーない。
496 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 07:20:19.34 ] ヌルポは必ず 0 だよ ビット表現が ~0 だろうが ソース上は必ず 0 で表現する だから >>476 はあり得ない というか (void*) 付きの NULL は C++ じゃなくて C だし >>476 は無茶苦茶やで
497 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 07:29:48.78 ] ~ヌルポ
498 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 10:50:31.28 ] ソースコード上のポインタリテラルの0はNULLとして扱われるが 内部表現が0(0番地)とは限らない //OK int* p = 0; delete p; //NG ただし殆どの環境で問題は起こらない int n = 0; int* p = reinterpret_cast<int*>(n); delete p;
499 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 11:32:04.45 ] そんなもん知ってる
500 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 12:16:01.43 ] C FAQ 読め。んで、そこに書いてあることは繰り返し書かなくていい。 www.kouno.jp/home/c_faq/c5.html
501 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 12:30:10.64 ] それCや
502 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 12:57:36.36 ] 規格票読んでもこの点に付いては同じ
503 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:01:32.98 ] 規格にこだわる人に限ってたいしたプログラムを書けない
504 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:02:29.84 ] ○○○さんのことかー
505 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:08:12.51 ] deleteするのとNULLを代入するのとどう違うんだよ
506 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:19:43.41 ] >>503 馬鹿かお前は 規格票は無駄な議論を終わらせるためにある
507 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:20:03.68 ] どこが同じなんだよ