- 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/
- 269 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 19:51:23.02 ]
- どう見ても永久ループです
ありがとうございました #include <iostream> class Base { Base* bp; public: Base(int i = 0) { std::cout << "Base() " << i << " time(s) called." << std::endl; bp = new Base(i + 1); bp->bp = 0; } Base** pointer() { return &bp->bp; } ~Base() { delete bp; } }; int main() { Base b; }
- 270 名前:240 [2012/05/24(木) 20:52:39.67 ]
- >>240 のお答えありがとうございました。こちらは理解出来ました。
ただもうひとつ、疑問があります。 このoperator=()が適用されないんですが なぜなのかさっぱりです。 というかこれは常識ですか? codepad.org/z5OlAQXL
- 271 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 20:57:20.69 ]
- 暗黙のうちに作られるoperator=(const X<x0,x1>&)があるから。
普通のメンバ関数なのでテンプレートより優先。
- 272 名前:240 mailto:sage [2012/05/24(木) 21:04:15.42 ]
- そうなんですか・・
デバッガでトレースしても何も無いし 暗黙なんて止めて欲しい・・ ともあれ、おかげで対策方法もやっとわかりました。 どうもありがとうございます。
- 273 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:25:58.77 ]
- Base() : bp(new Type()) {
} 初期化リストでnewするって無いよな スマポ使えとまでは言わんが、せめて 初期化リストはNULL初期化だわ 効率もスマポ使った時と変わらん Base():value1(NULL),value2(NULL) try { value1 = new Type(); value2 = new Type(); } catch(...) { delete value1; delete value2; }
- 274 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:42:36.30 ]
- いやそこはスマポ使えよ
- 275 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:43:59.04 ]
- NULLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
いや、俺はちゃんとnew_handler記述するよ。
- 276 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:47:16.61 ]
- というかnewがこけるときって、どういう状態なんだろ?
もうガッタガタで、プロセス落とすしかないんじゃないの?
- 277 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:55:28.25 ]
- >>276
Effective C++読んでみれ。 第三版はどうなってるか知らんが、第二版ではかなり最初のほうで出てくる話題。 メモリ不足への対策は初級クラスのプログラマでも必須の知識だってことなんだよ。 イメージできないなら、まだ初級プログラマになれてない。
- 278 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:59:38.27 ]
- と、思っていま第三版の目次を確認したら後方に移動してたw
二版では2章7項だったが、三版では8章辺りの話題のようだ。
- 279 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 00:02:50.74 ]
- あ、オレ初級以下だわ
- 280 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 00:05:45.16 ]
- メモリが有限だってことさえわかれば自然と不足する状況なんて考えられるはずなのに、
それがわからないって言ってるやつは結局エラー処理をサボる理由が欲しいだけなんでしょ。
- 281 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 00:06:34.49 ]
- クラスに自分へのポインタを持ってそこにnewして入れるなら
再帰呼び出しになるから、引数を入れて深さがある程度になったら 止めるなどの工夫をしないとstd::bad__alloc例外が投げられるのは目に見えている
- 282 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 00:07:23.77 ]
- その前にスタックオーバーフローで止まるかハングしそうだけどね
処理系によってはスタックオーバーフローしても何も言わずにそのまま続行するから たちが悪い
- 283 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 00:20:57.76 ]
- new と スタックがどう関わるか詳しく聞きたいものだな
- 284 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 00:37:07.29 ]
- コンストラクタの再帰呼び出しの機構は特に規格に入ってないけど
普通の関数のCALLみたいな機構で実現されてる場合が多いみたいです だから先にスタックが逝くような感じ
- 285 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 00:56:04.36 ]
- ウェブ上で配信されているMJPEG形式のストリームを読み込んでメモリ上でパースしたいです。
どのような方針で書けばいいでしょうか。 よろしくお願いします。
- 286 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 01:01:57.44 ]
- とりあえず適当にバッファにとって切り取っていけばいいんじゃないでしょうか
- 287 名前:285 mailto:sage [2012/05/25(金) 01:36:52.37 ]
- ソケット作ってってことですか?
ストリーミング取得しやすくするライブラリでもあればいいのですが。 ちなみに対象のMJPEGの構造は把握しているので独自に解析するとして、今は自分の中に以下の3つの課題があります。 ・データをどうやって取ってくるか ・送られてくるMJPEGを具体的にどのようにバッファして解析してバッファをリリース&次のデータを取得すればいいのか ・マルチスレッドで他の処理と並行して実行させたいので、プロセス内でjpgのやり取りをしたいのですが、 例えばOpenCVを使った画像処理スレッドとjpgを取得するスレッドをどうやって連携させるのか
- 288 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 04:07:11.32 ]
- >>287
1. wget URL | お前のプログラム 2. read(stdin) 3. シングルで動いてから考えろ 煽りじゃなくて本気でリファレンス実装作ってからじゃないとデバッグ大変よ?
- 289 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 04:37:11.10 ]
- 大きな問題を小さく分割して1つひとつ実現するセンスが必要
- 290 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 06:01:17.57 ]
- >>275-276
new演算子の問題じゃなく、newに付けたコンストラクターが 例外を出した時が問題なんだけどな
- 291 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 06:24:09.31 ]
- >>275
new_handlerつかっててもコンストラクタでコケたらメモリーリークする メモリーリークだけなら即致命的な事態にならないが ファイルロックや排他など各種ロックが掛かりっぱなしになる
- 292 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 06:26:00.68 ]
- 言葉が足りなかった。
>ファイルロックや排他など各種ロックが掛かりっぱなしになる これは、ロックするタイプのオブジェクトをnewで確保していた場合な
- 293 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 07:32:03.94 ]
- だからスマポ使えよ
- 294 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 08:24:38.42 ]
- >>291
new_handler とメモリーリークは関係ないだろ。
- 295 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 09:28:57.73 ]
- スマポ使ったら負けだと思うんだ。(笑)
- 296 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 09:35:01.30 ]
- スマポこそ人類の英知だ
そうは思わんかね
- 297 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 09:46:28.44 ]
- >>295 けっこうよく居るな、こういうやつ。なんなんだろうな?
- 298 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 09:58:18.30 ]
- >>291-292
細かいアレだけど「コンストラクタが例外安全なコードになってなかったら」だろ?
- 299 名前:283 mailto:sage [2012/05/25(金) 12:10:39.91 ]
- >>239
kwskおねがいしま(ry
- 300 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 12:58:34.67 ]
- shared_ptr使ったらあっさり書けて拍子抜けしたわ
C++はGCが付いてないんだからスマポ使った方がいいかもね メモリリークで本当に悩む
- 301 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 16:45:50.43 ]
- スマポが使えるなら使ったら方がいいが、
パフォーマンスやメモリの観点で使わない方がいい場合もあるからケースバイケースだな。
- 302 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 17:04:43.03 ]
- shared_ptrはともかくunique_ptrは消費メモリもオーバーヘッドも生ポインタと変わらんと思う
- 303 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 17:23:15.50 ]
- 生成と破棄x30000000、sizeof比較
int*: time: 2.13s ideone.com/2tLcx std::unique_ptr<int>: time: 2.13s ideone.com/wtba4 std::shared_ptr<int>: time: 4.41s ideone.com/UDuJE sizeof: ideone.com/EtftU > sizeof(int*) = 4 > sizeof(std::unique_ptr<int>) = 4 > sizeof(std::shared_ptr<int>) = 8
- 304 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 17:24:20.59 ]
- 亡きauto_ptrさん
ideone.com/sc7fr
- 305 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 17:56:17.19 ]
- ユニポすげえええええええええ
- 306 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 19:21:00.33 ]
- 多機能ではなくスマートさを追求したユニークさんこそ至高
- 307 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 19:33:51.01 ]
- >>297
会社がboost使わせねェんだから仕方ねぇだろ
- 308 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 19:41:03.98 ]
- >>307
scoped_ptrくらいなら定義すればいいだろ
- 309 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 19:43:11.82 ]
- >>307
内製の糞ライブラリ使うしかないのかwww
- 310 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 19:49:48.85 ]
- 社員の腕前まるっとまとめて信用されてないんだろ
紐付けとかないとなにやらかすかわからん集合無知みたいな
- 311 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 20:03:22.59 ]
- タダより高いものはないとか言ってセキュリティがうんぬん
- 312 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 20:10:06.48 ]
- じゃあ、コンパイラから全部内製で。
- 313 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 20:12:18.61 ]
- 単にboost分からないから使わせないだけだよ
- 314 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 20:13:50.23 ]
- じゃあ標準ライブラリは完全にわかってるのか。すごいなぁ。
- 315 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 20:19:58.86 ]
- const auto_ptr ぐらいは使えるだろ
- 316 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 20:24:12.06 ]
- というかC++だって完璧にわかってるやつなんてそうそういねぇよ
- 317 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 20:50:09.14 ]
- C++はあのPL/Iよりも言語仕様が大きいんだぜ
全部覚えたら神様と崇めるよ
- 318 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 20:58:47.74 ]
- std::vector<Hoge>でHogeをコピーしないでHogeのデフォルトコンストラクタ呼び出す方法ありますか?
- 319 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:02:10.59 ]
- ソースで示して
- 320 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:06:08.79 ]
- >>318
resize
- 321 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:07:54.55 ]
- C++11より前だとコピるぞ。
- 322 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:08:02.54 ]
- resizeでコピーが発生せずデフォコンで構築されるのはC++11から
- 323 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:31:17.40 ]
- >>307
どんな理由で禁止されてんの?
- 324 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:45:46.59 ]
- 上司「今の僕には理解できない」
- 325 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:47:35.90 ]
- 上司「うちはBCC使ってるんだけどコンパイル通らないじゃんあれ」
- 326 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:47:36.00 ]
- 「なぜあなたが理解できないということが禁止の理由になるのですか?」
- 327 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:47:46.73 ]
- >>323
テンプレが役に立たなかった時の名残
- 328 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:49:27.89 ]
- >>327
なら今はもう問題ないな。
- 329 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:50:34.36 ]
- VC6が未だ現役という・・・
- 330 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:51:37.50 ]
- boostのコンパイルが通らない環境の仕事つい最近まであった
- 331 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:53:21.90 ]
- 先輩「STLも禁止な」
- 332 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 21:55:01.37 ]
- 俺様「OTL」
- 333 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 22:13:36.61 ]
- Oresama Template Library
- 334 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 22:26:00.18 ]
- 先輩「templateも禁止な」
俺「それC++を使う意味なくないっすか?」
- 335 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 22:26:55.36 ]
- C99非対応の処理系ならベターCとして十分実用性が
おっとMicrosoftの悪口はそこまでだ
- 336 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 00:23:07.53 ]
- >>334
3〜5年前なら当たり前のようにそういう話があった 今でも少なくない
- 337 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 00:34:43.34 ]
- そうだな、昔も今もアホは居るからな。
- 338 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 01:21:21.23 ]
- もっと昔だと・・・templateは予約語だった
- 339 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 01:25:34.85 ]
- mapに特定のキーが登録されているかいないか調べる方法ありますか
- 340 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 01:27:44.73 ]
- find
- 341 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 01:30:26.65 ]
- count
- 342 名前:デフォルトの名無しさん [2012/05/26(土) 02:09:27.73 ]
- VS2010を用いているのですが、コントロールがクラシックデザインなのはどうしようもないんですか?
- 343 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 02:13:27.57 ]
- >>342
ttp://eternalwindows.jp/control/controlbase/controlbase09.html
- 344 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 02:46:18.77 ]
- >>313
コンパイラが変わると、コンパイルが通らないからだよ。 ビルド環境にboostがあるとは限らんし。 早くboostがstlになればいいんだよ。
- 345 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 02:51:18.55 ]
- 糞環境自慢されても
- 346 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 03:05:38.09 ]
- 業界標準以外は導入しづらい
- 347 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 07:27:02.37 ]
- >>294
遅レス&&全レス読んでないが、関係はある クラスFooのコンストラクタ内で例外が発生すると、 その時点で構築済みメンバのデストラクタはもれなく呼ばれるが Fooインスタンス自体のデストラクタが呼ばれない したがって、Fooがメンバとして単純なポインタFoo::m_pを含んでおり、 それに対するnewが成功した後に(別のnew等で)例外が発生すると Foo::m_pが指すメモリを解放する奴が居ないからリークする 解決策はFoo::m_pのような奴を生のポインタではなくauto_ptrにするとか
- 348 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 07:41:07.42 ]
- いやすまんnew_handlerか、
new_handler中身でやることのパターンは何通りかあるが、結局例外を投げてしまう場合、と読み替えてちょ
- 349 名前:デフォルトの名無しさん [2012/05/26(土) 13:07:43.57 ]
- コンパイラごとのSTLのアルゴリズムは
イテレーターのクラスによって要請されているインターフェイスの オペレーターを全て実装していることを仮定されていますか? よろしくお願いします。
- 350 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 16:52:27.58 ]
- >>349
C++に準拠してれば、C++の仕様に沿ったオペレーターを実装してるだろう。 C++に準拠してないコンパイラーの話なんかされても知らんがなとしか言えん。
- 351 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 17:23:19.31 ]
- >>349
何を聞きたいのかわからんが、 一応テンプレートに現れるシンボル(オーバーライドされたオペレータ含む)はtwo-phase lookupと言う規則で解決され、 インスタンス化しないテンプレートに現れるシンボルやオペレータについては宣言も実装も一切要らない
- 352 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 17:43:29.25 ]
- すなわちSTLアルゴリズムの使用するイテレーターテンプレートのインスタンスの
インターフェイスの提供するファンクションはSTLで実装されているイテレーターのイテレータークラス によって類別されて決定される全てのファンクションが実装されていることを前提としているのでしょうか?
- 353 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 18:00:41.46 ]
- コンセプトが導入されてない現状ではそのアルゴリズムの実装が使うイテレータの機能だけが使用可能ならば問題ない
だから現状ではイテレータの要件を完全には満たしてないクラスを渡しても動作するアルゴリズムの実装はありえる
- 354 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 18:05:54.57 ]
- ただし、あるアルゴリズムがイテレータのどの機能(ってfunction=関数?)を使うかは実装依存。
一回動けばいいような書き捨てプログラムでもない限りきっちり作っておくが吉。
- 355 名前:351 mailto:sage [2012/05/26(土) 18:56:58.81 ]
- ああスマン、自作イテレータをSTLのアルゴリズムに食わせる話か、
初心者なものでイテレータはSTLのコンテナから出てくるものが全てだと思い込んでいた、
- 356 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 20:27:12.61 ]
- 自前でちゃんとしたイテレータを書くのは
結構面倒くさいからboost使うといいよ
- 357 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 21:41:27.08 ]
- >>348 読み替えてもやっぱり new_handler とメモリーリークの関連が見えてきませんね。
- 358 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 21:50:08.94 ]
- 変態イテレータあるよな
for_eachで回すだけで面白い事が出来る奴とか
- 359 名前:291 mailto:sage [2012/05/26(土) 21:52:12.10 ]
- >>357=294 ?
俺は、>>275がnew_handlerでなんとか出来るらしいと 書いてたからnew_handlerでメモリーリーク対策できなくねと書いたまで。 new_handlerとメモリーリークが関係するかはしらんがな。
- 360 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 21:57:56.25 ]
- そうか。すまんかった。
- 361 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:03:50.90 ]
- >>357
Fooのコンストラクタ内で例外を捕捉しないものとして、 >347な状況でnew_handlerから(何でもいいが)bad_alloc等の例外をスローすると、Foo::m_pが指す先のメモリがリークする >347の状況であってもnew_handler内で(あらかじめ非常用にリザーブしておいたメモリから割り当てる等の手段で) 例外をスローせずに処理した場合、リークは起きない よって、new_handlerの中身がリーク発生に全く無関係とは言えない
- 362 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:09:06.28 ]
- 空きがもうない状況の話なのに
空きがあったらってぶっちゃけ関係ないよな
- 363 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:18:29.67 ]
- >>362
>空きがあったらってぶっちゃけ関係ないよな 空き0前提はともかく、非常用のリザーブ領域まで0前提なのか否かはスレの流れからは自明ではありませんね〜 new_handler内でユーザー向けダイアログボックス用にリザーブ領域メモリを割り当て、 エラー表示した後プログラム終了、という設計も有り得る
- 364 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:22:05.70 ]
- >>363
newが例外を出した時点で、new_handlerは失敗してる。
- 365 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:25:43.17 ]
- >>363
newが例外だしてりゃリザーブ領域空ですよね
- 366 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:30:47.43 ]
- >>364,>>365
kwsk デフォルトのnew_handlerを自作new_handlerに差し替えた後でも newが勝手に例外をスローするというのは初耳
- 367 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:36:04.77 ]
- >>366
自作new_handlerが何も割り当てできなかったらNULLでも返す気か? 要点は例外じゃなくて、new_handlerがなすすべがない状態におちいてっるて 所なんだからそれぐらいは解れよ
- 368 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:41:05.88 ]
- >>366
つまらん事で意地をはるな 得することなんて何もないんだから
- 369 名前:デフォルトの名無しさん mailto:sage [2012/05/26(土) 22:48:40.40 ]
- >>367
自作new_handlerなんだから、なすすべがない状態に陥らないように設計もできるよ? 単純な方法としては、プログラムの起動時に数KBかそこらのメモリを非常用にnewしておき、 そのポインタを大域変数g_pReservedに記録、 その後本当にメモリが0になったらg_pReservedからとりあえず返し、ただしプログラム終了フラグをセットして 速やかにプログラムを終わらせる、みたいな そのためのnew_handlerです
|

|