1 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 23:06:15.32 ID:HdItgJjm.net] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part121 peace.2ch.net/test/read.cgi/tech/1449240881/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.97【環境依存OK】 peace.2ch.net/test/read.cgi/tech/1439849418/ 次期規格C++1zはこちら C++14/C++1z 20 peace.2ch.net/test/read.cgi/tech/1410382924/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
152 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:27:35.65 ID:3jiwec3B.net] >>150 C++14の結果のようだが コミュ障は去れ
153 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:28:27.16 ID:oAun2w+9.net] >>148 えっえっ?!?! 今の今まで「14になったら使える機能か楽しみだ」と思ってた...
154 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:30:40.94 ID:hs0c0BKx.net] > C++14の結果のようだが そこは突っ込むのが正解なのかw なんか深遠な理由があるのか 高度な釣りなのかわかりかねたわ(>>144 に対してC++14の結果貼り付け)
155 名前:デフォルトの名無しさん [2016/01/27(水) 21:33:45.85 ID:0q1DRp6s.net] 初期化子って何だ? もしかしてメンバイニシャライザのこと?
156 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:36:46.74 ID:0q1DRp6s.net] >>153 Exceptional C++に出てくるぐらいにはメジャーだったはずだぞ
157 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:40:42.54 ID:3jiwec3B.net] >>155 それはですね 狡猾な>>140 が初期化子リストとメンバー初期化子とコンストラクター初期化子を混同した>>138 を惑わすために出した用語なんです気にしないで ちなみに規格ではnew A(100)とかの『(100)』の部分を指します
158 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:40:46.23 ID:5WlKM79a.net] >>155 > メンバイニシャライザ それちなみにどこで習ったの? どこの流儀?
159 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:42:32.38 ID:zSFGO6dq.net] >>152 はあそんなところに突っ込まれるとはw >>153 あなたはC++14でもだめでC++17になったら出来るかもって思ってたでしょw
160 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:43:28.66 ID:oAun2w+9.net] 申し訳ない。釣りではなく本当にfunction-try-blockはこれから来る規格だと思っていた。 >>156 持ってるけどそんな記述あったかな?
161 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:43:53.84 ID:3jiwec3B.net] >>158 >>141 を100回読み直してこい
162 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:45:04.77 ID:0q1DRp6s.net] >>158 流儀? メンバ変数の初期化を行うのはmember initializerだぞ
163 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:46:53.21 ID:gqKHFo+S.net] >>150 > B() try : _id(GetId()), _a(_id) > { > cout << "B:B" << _id << endl; > } > catch(int ex) > { > cout << "B:B" << _id << " exception " << ex << endl; このcatch内でのメンバ変数 _id の参照は未定義動作になる。 15.3 [except.handle] p10 > Referring to any non-static member or base class of an object in the > handler for a function-try-block of a constructor or destructor for that > object results in undefined behavior.
164 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:47:25.50 ID:0q1DRp6s.net] >>160 お前絶対読んでないだろw
165 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:48:01.49 ID:VHRBi97o.net] >>162 ごめんごめん、純粋に何でその名前を学んだか知りたかっただけ 上でも書いたけど俺はC++プライマーって本を読んで学んだんだけど たしかそれは 初期化リスト って書いてあったはずなんだ(多分) だからみんなソレをどこで学んで何と呼んでるのか気になっただけ
166 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:49:15.00 ID:oAun2w+9.net] 多分、なんか大昔の記事を読んで最新のものと勘違いしたまま来てしまったのだ... 鬱だ
167 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:51:52.82 ID:zSFGO6dq.net] >>163 ごめん その点は危ういと思ったけどGCCだと取り敢えず意図通りになってたから 話の本筋的にはどうでもいいと思っちゃった
168 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:52:17.67 ID:0q1DRp6s.net] すまん見直したらMoreの方だったw
169 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:52:25.06 ID:3jiwec3B.net] >>163 そういやそんな決まりがあったな すっかり忘れてた
170 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:54:30.71 ID:oAun2w+9.net] >>168 安心した。ありがとう。 俺が持ってるのは2000年11月15日発行とある。 みなさん、すいませんでした。
171 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 21:54:40.52 ID:88/bqypu.net] みんな企画とか読んでるのか偉いですね 1ページも読んだことないわ
172 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:01:47.89 ID:0q1DRp6s.net] >>170 Moreも2001年なんだから安心するなよw その頃からメジャーどころは載ってたはずだ
173 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:10:37.63 ID:0q1DRp6s.net] >>165 あまり意識したことはないので 恐らくコンパイラのメッセージだな 規格も読んだが後付けだと思う
174 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:13:35.94 ID:oAun2w+9.net] 鬱だ
175 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:15:41.80 ID:jBJgujTM.net] >>173 > 恐らくコンパイラのメッセージだな なるほどなるほど! こういうレスをついにもらえて俺喜んでる
176 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:27:11.15 ID:vltUk2i7.net] ここは罵倒したりされたりを楽しむ変態スレ。 記憶でレス→お前バカか→バカはお前→証拠だオラ→悪ぃ悪ぃw これが挨拶みたいなもん。 一度した発言は曲げてはならないという。
177 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:35:48.89 ID:zgyqI55G.net] RAIIは論理的には正しいかもしれないが 記述量の割に得られる対価が例外に対する備えだけ、 というのが気に入らない RAIIなプログラムのメモリ消費量はなかなか安定に達しないから(∵確保したり開放したりで断片化が進んだり治まったり、 意図とはうらはらに、実は第三者に対してメモリリークが無いことの証拠提示がヒジョーに厄介なプログラムになってしまったりする
178 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:45:20.30 ID:gqKHFo+S.net] >>177 隙だらけすぎるだろ。 > 記述量の割に得られる対価が例外に対する備えだけ、 基本的なところは標準ライブラリでカバーされてるんだけど、記述量ってどんなコード想定してんの? それに、例外以外にreturnやbreakにも利くよ。 > RAIIなプログラムのメモリ消費量はなかなか安定に達しないから(∵確保したり開放したりで断片化が進ん 確保解放のパターンがRAIIで規定されるわけないし、使い方でどうにでもなるでしょ。 > 意図とはうらはらに、実は第三者に対してメモリリークが無いことの証拠提示がヒジョーに厄介なプログラムに RAII使わない、生でdeleteやらなんやら書いてるコードよりはマシでしょ。悪化する例があるなら見たい。
179 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:49:16.44 ID:zSFGO6dq.net] >>177 ?それはおかしな見解だな RAIIを徹底するほうが記述量も少なくなる(delete書かなくて済むんだから)し、 メモリリークが無いことも遥かに容易に証明できると思うが? それで納得しない第三者なんて頭が腐ってるんだから相手にするだけ無駄 断片化については直接new、deleteするのと変わらないし
180 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:55:49.88 ID:zgyqI55G.net] >>178 いちいちstd::shared_ptr<T>とか打ちたくないし、pSomeSmartPtr.get()ですらちょっと嫌 メモリ直接ならまだ標準ライブラリでカバーされるが、OSがハンドルを返す場合はwrapperを書かねばならない そしてコンストラクタが例外をスローするのに処置しようとしたら、 漏れの無いtry { } catch { }を書くか、メンバ変数を全部wrapperかスマポにせねばならない これは苦行以外の何者でもない そしてクラスの群れを書く面々のうちの誰か一人がしくじれば、やはりリークする returnやbreakについては、例外と違って伝統的な書き方で対処可能 例外はスマポとか、try { } catch { } みたいな仕掛けが要る
181 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:56:07.86 ID:3jiwec3B.net] 記述量は局所的な見た目の煩雑さのことを言ってるのだろうに トータルの記述量の話にすり替えとはこれ如何に
182 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 22:59:19.51 ID:zgyqI55G.net] >>179 >そしてクラスの群れを書く面々のうちの誰か一人がしくじれば、やはりリークする この危険性についてコードを見るだけで検証完了という信じる方がよっぽどキチ 同じコードを見る話なら、固定長の配列の方が安心できる
183 名前:デフォルトの名無しさん [2016/01/27(水) 23:00:49.72 ID:0xRCKJUw.net] あらゆる箇所にいちいちdelete Tとか打ちたくないわ
184 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:04:15.53 ID:zgyqI55G.net] >>183 もちろんナマポも極力使わない やっても関数内で確保したやつを関数を抜けるとき全部開放する使い方のみとしたい(この用途にはstd::unique_ptr<T>を使ってやっても良い この構造に統一するなら、メモリの断片化は生じない(まあだれか一人がしくじれば…というのは同じだが
185 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:07:10.32 ID:zSFGO6dq.net] なんだ固定長配列至上主義者か せいぜい頑張って下さい
186 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:08:36.16 ID:3jiwec3B.net] >この危険性についてコードを見るだけで検証完了という信じる方がよっぽどキチ 文脈を考慮して読み解かなくても局所的なコード確認の積み重ねのみで全体に漏れがないことを保証できるのがRAIIだと思っていたのだが…
187 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:13:29.29 ID:zgyqI55G.net] 加えてRAIIにはマルチコア時代にふさわしくない疑いがある RAIIで確保したり開放したるするメモリがスレッド固有という保証が無い限り、 確保や開放の度に排他制御が行われる スタック上にとられた配列がペナルティーゼロであることを鑑みれば、 InterlockedIncrement()ですら塵も積もれば巨大なコスト足りえる
188 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:18:25.90 ID:zSFGO6dq.net] そんなにヘビーなループで確保/解放を繰り返さなきゃいけない場面では俺だってダイナミックアロケーションを避けるけどね
189 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:20:30.30 ID:eULyfEEH.net] >>187 言っていることがよくわからないね shared_ptrのコストが気になるならnewせずに スタック上に確保するなりなんなりすればよいだけだろうに そっちの方が正統派のRAIIだというのに何を言っているのだろうか まったくお門違い むしろスタック上にオブジェクトを確保できる言語の方が珍しくて C++ではそれができるだけでも有り難いというのに
190 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:20:47.91 ID:I7Q8DIXY.net] 普段よりも応用を利かせたコードの書き方の検討をして、まだ知識があいまいなところ をはっきりさせようと、本で調べ物をしてたら、「プログラミング言語 第3版」よりも、 「C++ Primer 改訂3版」のほうが、はっきりと疑問に答えてくれると感じた。応用で検討 していることが可能になるか、それとも無理かをすぐに結論を出してくれるみたいな。 もう一方の本は、ストラウストラップ流のプログラム技術の英知を読者に提供しようとは してるようだけど、仕様で細かいところを素早く確認するのはまだ物足りないかもしれな いな。
191 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:21:41.35 ID:3jiwec3B.net] >スレッド固有という保証が無い限り、 確保や開放の度に排他制御が行われる >スレッド固有という保証が無い限り、 確保や開放の度に排他制御が行われる >スレッド固有という保証が無い限り、 確保や開放の度に排他制御が行われる ひょっとしてRAII=shared_ptrとでも勘違いしたのだろうかこの馬鹿は 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
192 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:26:34.20 ID:I7Q8DIXY.net] 今は「プログラミング言語 第4版」が新しく出たようだけど、今はC++14らしいが、 この本はC++11のようで、編集が一歩遅れてるという印象は否めない。 読者はC++14準拠の第5版を望んでるかもしれないな。
193 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:27:07.17 ID:0q1DRp6s.net] >>177 >記述量の割に得られる対価が例外に対する備えだけ さすがにこれはないわなあ 今更RAII無しでlockとか絶対使いたくない
194 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:47:08.39 ID:0q1DRp6s.net] ここまで俺の自演
195 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:47:41.22 ID:tYkYQITg.net] 前にEffectiveC++も新版が出たけど、もう絶対的な名著ってわけでもないような
196 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:52:26.77 ID:gqKHFo+S.net] >>180 10年ぐらい前にはこんな爺さんがよく居たもんだが、まだ居るのか・・・。 > いちいちstd::shared_ptr<T>とか打ちたくないし、pSomeSmartPtr.get()ですらちょっと嫌 慣れる。どうしても嫌なら好きに using でもしとけばいい。 get() なんて使わんでいい。 > メモリ直接ならまだ標準ライブラリでカバーされるが、OSがハンドルを返す場合はwrapperを書かねばならない 自分で書くケースがあるのはそうだが、稀だろ。 稀じゃないなら、個別に破棄処理を漏れなく書いて回るよりも一度書けば済むRAIIのほうがマシ。 > メンバ変数を全部wrapperかスマポにせねばならない > これは苦行以外の何者でもない std::shared_ptr<T>が打てない状況ならそうかもしれないな。 でもそれは個人的な事情であってRAIIの問題じゃない。 > そしてクラスの群れを書く面々のうちの誰か一人がしくじれば、やはりリークする RAII関係ない。 > returnやbreakについては、例外と違って伝統的な書き方で対処可能 伝統的で且つ面倒な書き方でな。RAIIのほうが楽。
197 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:54:32.28 ID:0q1DRp6s.net] >>195 古いのは確かだがまだ十分使えると思うね 他に初心者用の良い本があれば別だけど
198 名前:デフォルトの名無しさん mailto:sage [2016/01/27(水) 23:57:30.71 ID:0q1DRp6s.net] スマポはgoogleやmozillaのソース見ればそこらじゅうにあるな それを全部書き下せる自身があるならどうぞ
199 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 00:38:12.26 ID:5VmqP1pO.net] >>132 絶望した! >>135 いやいや、初期化子に並んでるクラスまでtryで囲む必要ないでしょ? 彼らは彼らで後始末するのだから。 自分の後始末せずに例外投げるクラスがいたら、どんな手段を使ったって後始末できないよ。 コンストラクタに限る問題じゃない。
200 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 01:13:22.83 ID:9zxCdjKY.net] >>199 後始末したあと例外を投げて来るやつをcatchするんじゃない?
201 名前:デフォルトの名無しさん [2016/01/28(木) 06:48:43.02 ID:OteWNMPZ.net] RAIIってなんて発音するの? ライー? ラッツー?
202 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 07:29:19.73 ID:y2I8o1dH.net] ラール
203 名前:デフォルトの名無しさん [2016/01/28(木) 07:37:04.01 ID:WeC7vVSZ.net] ライッ!
204 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 07:41:40.98 ID:y2I8o1dH.net] >>199 catch(...)
205 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 08:26:24.97 ID:5VmqP1pO.net] >>204 言葉足らずですまんが、自分が言及した自分自身の後始末っていうのはそのクラス内部の後始末のこと。 ハードを止めるとかメンバのメモリ開放とか。 使う側のクラスは後始末しないクラスの内部のことなんてわからないから、どんな手段を使ったってそのクラスの後始末はできない。 だから、そんなクラスがいることを前提として議論するのはおかしいってこいいたかったわけ。 そのクラスの提供者に直してもらうしかない。
206 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 08:35:58.09 ID:9zxCdjKY.net] >>205 それは正しいが、そこが論点じゃないと思う。 コンストラクタ内でエラーが起きたとき、「後始末はちゃんとやったあと例外をthrowする」クラスに 対処することを想定してる。
207 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 08:51:24.46 ID:5VmqP1pO.net] >>206 対処する必要なんてあるの? 繰り返すけど、 初期化子で構築完了したクラスはデストラクタで後始末されて、例外吐いたクラスも自身のtrycatch再throwで後始末してるんだぜ? 親側自身の雑多な初期化処理は始まってもいない。 …と書いてみたが、自分が間違ってるわ。 これで対応できない例外シチュもあり、そんな場合は個別対応すればよいだろうとは思ってたけど、例外とは呼べないほどそんな場面は多い気がしてきた。
208 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 09:29:37.28 ID:ptM8I7fQ.net] >>207 「これで対応できない例外シチュ」ってどんなの?
209 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 11:10:21.47 ID:5VmqP1pO.net] >>208 dispose()とかclose()みたいな関数を呼んでやらないと終了処理できないやつ。
210 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 11:21:23.95 ID:ptM8I7fQ.net] >>209 fclose や fstream みたいな、能動的操作処理と破棄処理が不可分になってるもののことかな。 そういうクラスをメンバを持つクラスのコンストラクタで例外が出たとした場合に行う「個別対応」って、 たとえばどんなの? デストラクタが最低限の処理をしてくれてれば何もしなくていいケースがほとんどだと思うんだけど。
211 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 13:13:16.79 ID:5VmqP1pO.net] >>210 終了処理がsendfinとかwaittimeoutとかだったりしたら、デストラクタで勝手にやられたら困らね? 非対称的に終了処理関数が用意されてることも少なくないと思う。 バグなら直せと言えるけど、設計いけてないから直せとはなかなか要求しにくい。
212 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 13:56:52.11 ID:tIrgtpz+.net] デストラクタでfcloseとか何ですのん? ファイル操作をオブジェクトの寿命で扱うのって大掴みすぎねぇ? だからコンストラクタやデストラクタでそんなもんの例外までに話が至っちまう 書き込む瞬間、読み無瞬間だけ一瞬だけファイルを開けや そこまではバッファに書きこんどけや糞ども
213 名前:デフォルトの名無しさん [2016/01/28(木) 14:51:57.24 ID:Fy8z7rZ+.net] 一つわかった RAIIと例外を背反と考えてる人がいる
214 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 19:35:11.13 ID:CFwd7jm1.net] >>212 ログライブラリを開発しているのですが 一瞬だけ開くようにすると処理時間が100 倍以上 になって困っています。 どうすればよいですか?
215 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 19:59:05.52 ID:9zxCdjKY.net] >>212 ファイル書き込みオブジェクトをファクトリ関数経由で 一時オブジェクトとしてしか生成できないようにしたことがある。 書き込んだらすぐデストラクタが走るのさ。
216 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 19:59:21.20 ID:D7v4IB1O.net] バッファが無限にあると思ってる人に聞くだけ無駄
217 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 20:01:49.04 ID:VbpHGgsr.net] >>215 kwsk
218 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2016/01/28(木) 20:02:05.39 ID:YC3cOEYy.net] >>214 出力が遅いなら、キャッシュとして出力内容をためておけば
219 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 20:11:54.15 ID:D7v4IB1O.net] アプリが落ちて肝心な最後のログレコードが見えないのでしたチャンチャン
220 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 21:05:31.79 ID:DYq8nyhg.net] ログを安易にバッファリングする奴は間違いなく低能
221 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 23:03:17.58 ID:iP985GXo.net] 自作プログラムのログを取る必要が未だ生じたことが無い天才かも知れん
222 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 23:07:22.96 ID:YmAPLaNv.net] んなこたない 糞コテ=馬鹿 で決まり
223 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 23:11:59.87 ID:iP985GXo.net] ログメッセージを複数スレッドから単一のコンソールに出す場合はcerrよりcoutの方がメッセージの1行同士が混ざる危険性が目に見えて減る デバッグレベルならprintf()して何か条件を満たしたらfflush(stdout); throw;、が最強
224 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 23:17:33.09 ID:Fy8z7rZ+.net] >>223 >ログメッセージを複数スレッドから単一のコンソールに出す場合はcerrよりcoutの方がメッセージの1行同士が混ざる危険性が目に見えて減る 気のせいだろ マルチスレッドなら、素直に同期したほうが良いぞ
225 名前:デフォルトの名無しさん mailto:sage [2016/01/28(木) 23:50:40.02 ID:ptM8I7fQ.net] >>211 その困る場合の「対処」の例が聞きたかった。 デストラクタに嫌な終了処理が埋まってて困るという場合は対処のしようも無い =結局何もしなくていいんじゃないの? それで実用上の問題があるなら直せと言えるはず。 コンストラクタで例外が飛んだってことは問題の終了処理を持つオブジェクトを使って やろうとしてた処理全体は失敗したわけで、正常処理の締めに必要な 終了処理( fstream で close() とか)の明示的呼び出しも必要ないことが多いだろうし。
226 名前:デフォルトの名無しさん mailto:sage [2016/01/29(金) 19:24:04.25 ID:dpjhh/AA.net] >>52 > > A *a(int i) {return as.add(new A(i));} > add() の中の push_back() で例外飛んだらリークする。 これはpush_back()出来なかった分をケアしてやればおk? https://ideone.com/s4ibLz ・天然のstd::bad_allocは得られなかったので誤魔化した
227 名前:デフォルトの名無しさん mailto:sage [2016/01/29(金) 21:58:56.14 ID:V57FZVNV.net] 生ポ好きの書きそうな糞みたいなコードだな ↓こんなんでいいだろ v.reserve(v.size() + 1); v.push_back(new Fuck);
228 名前:デフォルトの名無しさん mailto:sage [2016/01/29(金) 22:53:49.61 ID:tuK26dsC.net] 技術的な話題をせず ブログラミングを種に喧嘩ばかりしてるやつって何なの チンパンジーなの?
229 名前:デフォルトの名無しさん mailto:sage [2016/01/29(金) 23:21:25.56 ID:q1Jl0W+Y.net] いきなりどうした 誤爆か?
230 名前:デフォルトの名無しさん mailto:sage [2016/01/29(金) 23:29:27.61 ID:HWJSMXKP.net] >>227 そんな意味不明なreserveする奴が偉そうなこと言っても
231 名前:デフォルトの名無しさん mailto:sage [2016/01/29(金) 23:35:27.84 ID:ASWZHNV8.net] >>226 おじいちゃん、「おとなしくスマートポインタ使えば」おkだっていったでしょ。聞こえてる?
232 名前:デフォルトの名無しさん mailto:sage [2016/01/29(金) 23:52:06.13 ID:Hpd/92hj.net] >>230 いや意味が全く無いわけではない std::vector::push_back()呼び出し時点での余分な領域確保とか、速度低下が最小化される
233 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 00:09:33.50 ID:VhIzDspW.net] >>232 230 じゃないけど、 >227 の reserve() で「速度低下が最小化される」なんてことは無いでしょ。 単発なら変わらないだろうし、ループした場合は reserve() しないほうが速いし。
234 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 00:17:51.94 ID:lYkNZO2m.net] >>232 ないない push_backで領域が足りなければreserve相当のことは自動的にされるし まあないだろうがstd::vectorの実装によってはsize()+1のreserveが速度に悪影響与えることだってあり得るんじゃないかな >>227 のもう一つ痛いところはreserveさえしておけばpush_backでの例外が無いと決めつけてるところ そんな規定はないだろ?
235 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 00:21:53.24 ID:nKxSIfYZ.net] >>234 > push_backでの例外が無いと決めつけてるところ というより、それを一切考慮してない希ガスw そいつ一人だけ問題の本質に到達できていない bad_allocが投げられるのは一緒ってことも知らないんだろうし
236 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 00:55:16.18 ID:GfziY506.net] はてどこからbad_allocが出てきたのか
237 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 03:14:53.57 ID:HpDJFp9+.net] >>233 、>>234 漏れは慎重に「std::vector::push_back()呼び出し時点での」と限定して書いたで?
238 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 05:43:02.21 ID:VhIzDspW.net] >>237 ん?だから何? push_back() 関数内での領域確保・実行時間を減らして、それらを push_back() の 直前の処理に移動することに何か意味があるとでもいうの?それはどんな場合にうれしいの?
239 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 05:59:47.15 ID:GfziY506.net] A「意味がないわけではない」 「〜される」 B「そんなことは ない」 A「そんなこと ある だろ」 B「だから何?〜だと何かいいことあるのか?」 >>232 の2つの文のどちらについて話をしているのかの認識がずれていることに気付かない低能どもの会話は滑稽だな
240 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 06:17:44.28 ID:GfziY506.net] やっぱり馬鹿にC++は無理だな メモリ確保のnew/deleteは禁止にしてスマポとコンテナーだけ使っとけ ついでに馬鹿はshared_ptrも使用禁止にしといた方が安全
241 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 11:02:01.65 ID:u8r8Wxi4.net] > v.reserve(v.size() + 1); > v.push_back(new Fuck); やっぱり馬鹿にC++は無理だなw push_backの直前で+1サイズのreserveとかw www.cplusplus.com/reference/vector/vector/reserve/ ここのExampleみてお勉強しなおしたら? 例外投げるのも書いてくれるから学んどけよ
242 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 11:46:11.52 ID:GfziY506.net] 初回がresize前のcapacityと比較して何が言いたいのかよくわからん例だな push_backはcapacityに余裕が有るときに再アロケーションしないことは保証されているが 例外を出さない保証は23.3.6.5から読みとれないな やはり馬鹿にはスマポを強制したほうがいい
243 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 13:13:55.69 ID:VK1fBsAo.net] >>238 reserve()とpush_back()のどちらで例外が発生するかという文脈において、 >>227 のreserve()がpush_back()の直前行であるという解釈は一体… まあv.reserve(v.size() + n);ならともかく、v.reserve(v.size() + 1);だったから気持ちはわからんでもない
244 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 14:18:45.97 ID:GfziY506.net] どうみても>>227 はpush_back(というかnew)の直前にしか見えないのに 何を言ってるんだお前は
245 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 15:00:28.25 ID:9j1RlcoP.net] 挿入前に拡張しておけという有難い教えだな。
246 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 16:17:33.41 ID:GfziY506.net] >>245 挿入前に拡張すると(要素のコンストラクター以外では)例外が出ないという保証はある?
247 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 16:22:43.98 ID:AurOqJPw.net] >>245 はC++とは違う話題かと。 Cとなら関係あるかも知れないが、プログラミング言語でないC。 もちろん俺の読み違いかもしれない。
248 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 16:27:26.60 ID:7MlWNObS.net] あと一個で例外が飛ぶようなメモリ状況で ☆一行のとき v.push_back(foo); // ここで例外 ☆二行のとき v.reserve(v.size() + 1); // ここで例外 v.push_back(foo); こうなるだけじゃないの? 新たな連続した一本のメモリが確保できないと例外なんだから
249 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 16:35:52.43 ID:lYkNZO2m.net] >>246 規格を読んだ限り保証はされてないね 現実に存在する実装ではreserve済みであれば生ポのpush_backじゃ例外発生しないだろうけどね そんなことはアテにしちゃいけない
250 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 01:01:58.63 ID:CuJD672c.net] reserveで例外かわせても、次のnewによるメモリ確保で例外になる可能性はなくならないのだから、 newを一旦別の変数で受けるしかないでしょ hoge h; h = new hoge; vec.push_back(h); が正解。
251 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 01:58:17.63 ID:fnCrDph6.net] いやいやwもういいからスマポをmake_uniqueとかmake_sharedで使っておけ バカはnewを書くな!
252 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 02:09:31.02 ID:CuJD672c.net] >>251 あんたバカバカ言ってるけどnewを使うかmake_sharedを使うかはこの問題の本質じゃないから。 馬鹿じゃないならわかるよね?