[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/16 02:43 / Filesize : 202 KB / Number-of Response : 823
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part95



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 ]
どこが同じなんだよ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<202KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef