アカウント名:
パスワード:
>スラドの皆さんで、当てにならない出版社やシリーズ、著者をご存知なら、この機会に是非経験談を披露していただきたい。
個人的な印象を言えば、ウェブの方があてになりませんが。
「1.コンストラクタ内でコンストラクトされたものは例外送出時にデストラクトされる?」はどうやって確認されたのでしょうか。次のコードでは、hogeのコンストラクタ内で、メンバfとbをコンストラクトしようとしていますが、b内部で例外が送出されます。このとき、完全にコンストラクトが終わったfはデストラクトされます。一方で、コンストラクト途中のbやコンストラクトされる前のf2はデストラクトされませんが(ho自身もコンストラクト途中で例外が投げられたとしてデストラクトされません)。これで、fooがコンストラクタ内部でnewしてデストラクタ内部でdeleteするクラスだったとしても、きちんとnew/deleteが対になって呼ばれます。
#include <iostream> class foo{public: foo() {std::cout << this << " foo()" << std::endl;} ~foo() {std::cout << this << " ~foo()" << std::endl;}};class bar{public: bar() {throw std::exception();} ~bar() {std::cout << this << " ~bar()" << std::endl;}}; class hoge{public: hoge() : f(), b(), f2() {} ~hoge() {std::cout << this << " ~hoge()" << std::endl;}private: foo f; bar b; foo f2;}; int main(){ try { hoge ho; } catch(const std::exception&) { }}
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
ウェブ全盛 (スコア:0)
>スラドの皆さんで、当てにならない出版社やシリーズ、著者をご存知なら、この機会に是非経験談を披露していただきたい。
個人的な印象を言えば、ウェブの方があてになりませんが。
Re: (スコア:0)
C++の例外処理について記載が手持ちの本に無いので、Webで調べているのですが、印象としては、「コンストラクタ内で後始末をした上で、例外を送出する」か、「スマートポインタを利用した上で、例外を送出する」か、そもそも、「コンストラクタで例外を送出する場合は、コンストラクタ内でコンストラクトされたオブジェクトはデストラクトされるから、気にせず送出しろ」の3種類が優勢のよう。
確認すべきポイントは、
1.コンストラクタ内でコンストラクトされたものは例外送出時にデストラクトされる?
2.コンストラクタの開始時に確保したメモリは例外送出時に解放される?
手元のgcc(4.3.2)で試したところ、1.は正しくないが、2.は正しい。したがって、例外送出前にコンストラクタ内で作られたオブジェクトの始末は考えないといけない。
Webは玉石混交だけど、いろいろな意見を収集できるところに、価値があるかな。
Re:ウェブ全盛 (スコア:0)
「1.コンストラクタ内でコンストラクトされたものは例外送出時にデストラクトされる?」はどうやって確認されたのでしょうか。次のコードでは、hogeのコンストラクタ内で、メンバfとbをコンストラクトしようとしていますが、b内部で例外が送出されます。このとき、完全にコンストラクトが終わったfはデストラクトされます。一方で、コンストラクト途中のbやコンストラクトされる前のf2はデストラクトされませんが(ho自身もコンストラクト途中で例外が投げられたとしてデストラクトされません)。これで、fooがコンストラクタ内部でnewしてデストラクタ内部でdeleteするクラスだったとしても、きちんとnew/deleteが対になって呼ばれます。