アカウント名:
パスワード:
>スラドの皆さんで、当てにならない出版社やシリーズ、著者をご存知なら、この機会に是非経験談を披露していただきたい。
個人的な印象を言えば、ウェブの方があてになりませんが。
初期化リストを使うんだ。以上。
なるほど、間違った記述だらけですね。というかほんとにC++でそんな議論があるのか?
つかC++で例外を投げるとデストラクタが呼ばれるなんてありえんだろうが。# C++/CLIとかGC付きの特殊なC++実装とごっちゃにしている?それともJavaやC#?明示的にdeleteしなきゃデストラクタは呼ばれない。スマートポインタも結局のところ明示的にdeleteするのを隠蔽しているだけでdeleteしている。そもそもnew出来なかったオブジェクトはdeleteできない、そしてデストラクタを呼ぶことが出来ない。という基礎を理解してればそんな議論にはならないと思うのだが。
Webも書籍も玉石混交なのは変わらんよ。
おいおい、自動変数は例外だろうが何だろうがスコープ抜ける時デストラクタ呼ばれるじゃんよ。別ACのC++初心者だがそれくらいは知ってるぞー。
「1.コンストラクタ内でコンストラクトされたものは例外送出時にデストラクトされる?」はどうやって確認されたのでしょうか。次のコードでは、hogeのコンストラクタ内で、メンバfとbをコンストラクトしようとしていますが、b内部で例外が送出されます。このとき、完全にコンストラクトが終わったfはデストラクトされます。一方で、コンストラクト途中のbやコンストラクトされる前のf2はデストラクトされませんが(ho自身もコンストラクト途中で例外が投げられたとしてデストラクトされません)。これで、fooがコンストラクタ内部でnewしてデストラクタ内部でdeleteするクラスだったとしても、きちんとnew/d
まさに今、ここで石ころが増産されてるね。> コンストラクタ内でコンストラクトされたものは例外送出時にデストラクトされる?「何の」コンストラクタで「何を」「どのように」コンストラクトして、「何が」「いつ」例外を出したら「何の」デストラクタが呼ばれるって話なの?おまけに「コンストラクトして」「デストラクトされる」って動詞の定義も曖昧。ctor/dtorが呼ばれるかって話か、リソース解放まで含みを持たせてるのか。どうとでも取れるクエスチョン出すもんだから皆てんでに解釈して「正しいとも間違っているとも言える」回答ばかりになってるよ。
あえて「私の勝手
C++ではコンストラクタってのは { と } の間に書いたコードだけの話じゃなくてメンバ変数の初期化、基底クラスのコンストラクタ呼び出し、メモリ上への配置、などなど含めてコンストラクタなので「コンストラクタ内」の表現で合ってると思う。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人
ウェブ全盛 (スコア:0)
>スラドの皆さんで、当てにならない出版社やシリーズ、著者をご存知なら、この機会に是非経験談を披露していただきたい。
個人的な印象を言えば、ウェブの方があてになりませんが。
Re:ウェブ全盛 (スコア:0)
C++の例外処理について記載が手持ちの本に無いので、Webで調べているのですが、印象としては、「コンストラクタ内で後始末をした上で、例外を送出する」か、「スマートポインタを利用した上で、例外を送出する」か、そもそも、「コンストラクタで例外を送出する場合は、コンストラクタ内でコンストラクトされたオブジェクトはデストラクトされるから、気にせず送出しろ」の3種類が優勢のよう。
確認すべきポイントは、
1.コンストラクタ内でコンストラクトされたものは例外送出時にデストラクトされる?
2.コンストラクタの開始時に確保したメモリは例外送出時に解放される?
手元のgcc(4.3.2)で試したところ、1.は正しくないが、2.は正しい。したがって、例外送出前にコンストラクタ内で作られたオブジェクトの始末は考えないといけない。
Webは玉石混交だけど、いろいろな意見を収集できるところに、価値があるかな。
オフトピご免 (スコア:1)
初期化リストを使うんだ。以上。
Re: (スコア:0)
newとかで生成されたオブジェクトは、例外発生してもロールバックされませんので。
だからそのようなオブジェクトも処理してくれるスマートなポインタが便利です。
コンストラクタでリソースを確保するのは、それこそ例外安全的にもまずいです。
Exceptional C++を読むことをおすすめします。
Re: (スコア:0)
なるほど、間違った記述だらけですね。
というかほんとにC++でそんな議論があるのか?
つかC++で例外を投げるとデストラクタが呼ばれるなんてありえんだろうが。
# C++/CLIとかGC付きの特殊なC++実装とごっちゃにしている?それともJavaやC#?
明示的にdeleteしなきゃデストラクタは呼ばれない。
スマートポインタも結局のところ明示的にdeleteするのを隠蔽しているだけでdeleteしている。
そもそもnew出来なかったオブジェクトはdeleteできない、そしてデストラクタを呼ぶことが出来ない。
という基礎を理解してればそんな議論にはならないと思うのだが。
Webも書籍も玉石混交なのは変わらんよ。
Re: (スコア:0)
おいおい、自動変数は例外だろうが何だろうがスコープ抜ける時デストラクタ呼ばれるじゃんよ。
別ACのC++初心者だがそれくらいは知ってるぞー。
Re: (スコア:0)
「1.コンストラクタ内でコンストラクトされたものは例外送出時にデストラクトされる?」はどうやって確認されたのでしょうか。次のコードでは、hogeのコンストラクタ内で、メンバfとbをコンストラクトしようとしていますが、b内部で例外が送出されます。このとき、完全にコンストラクトが終わったfはデストラクトされます。一方で、コンストラクト途中のbやコンストラクトされる前のf2はデストラクトされませんが(ho自身もコンストラクト途中で例外が投げられたとしてデストラクトされません)。これで、fooがコンストラクタ内部でnewしてデストラクタ内部でdeleteするクラスだったとしても、きちんとnew/d
Re: (スコア:0)
まさに今、ここで石ころが増産されてるね。
> コンストラクタ内でコンストラクトされたものは例外送出時にデストラクトされる?
「何の」コンストラクタで「何を」「どのように」コンストラクトして、「何が」「いつ」例外を出したら「何の」デストラクタが呼ばれるって話なの?
おまけに「コンストラクトして」「デストラクトされる」って動詞の定義も曖昧。ctor/dtorが呼ばれるかって話か、リソース解放まで含みを持たせてるのか。
どうとでも取れるクエスチョン出すもんだから皆てんでに解釈して「正しいとも間違っているとも言える」回答ばかりになってるよ。
あえて「私の勝手
Re: (スコア:0)
コンストラクタ内でメンバ変数が生成されるって変でしょうよ。
Re: (スコア:0)
C++ではコンストラクタってのは { と } の間に書いたコードだけの話じゃなくて
メンバ変数の初期化、基底クラスのコンストラクタ呼び出し、メモリ上への配置、などなど含めて
コンストラクタなので「コンストラクタ内」の表現で合ってると思う。
Re: (スコア:0)
オフトピなので、この辺で。