メソッドチェインを使用するシンプルなC++プログラムがあり、デストラクタは連鎖呼び出しでのみ使用されると2回呼び出されることに気付きました。これはチェーンコールにコンストラクタも含まれている場合にのみ発生します。個別に呼び出された場合、デストラクタは一度だけ呼び出されます。C++メソッド連鎖によりデストラクタが2回呼び出される
コードは以下の通りです:このアプリケーションの
class Foo {
public:
Foo() { cout << "-- constructor " << this << endl; }
~Foo() { cout << "-- destructor " << this << endl; };
Foo& bar() {
cout << "---- bar call " << this << endl;
return *this;
}
};
int main() {
cout << "starting test 1" << endl;
{
Foo f = Foo();
}
cout << "ending test 1" << endl << endl;
cout << "starting test 2" << endl;
{
Foo f = Foo().bar();
}
cout << "ending test 2" << endl;
return 0;
}
結果は以下の通りです:
starting test 1
-- constructor 0x7ffd008e005f
-- destructor 0x7ffd008e005f
ending test 1
starting test 2
-- constructor 0x7ffd008e005f
---- bar call 0x7ffd008e005f
-- destructor 0x7ffd008e005f
-- destructor 0x7ffd008e005f
ending test 2
は、この標準の動作(?もしそうなら、なぜそれがある)か、それとも私はいくつかのミスをしたのですか?これを防ぐことはできますか?
は1 –
がすべての答えで述べたコピーは以下で何が起こっているかを確認するためにコピーコンストラクタと代入演算子を追加します[ elided](http://en.cppreference.com/w/cpp/language/copy_elision)を参照してください。 'g ++ -fno-elide-constructors'を使ってコンパイルすると、2つのデストラクタが呼び出されます。 – vsoftco
それはかなり面白いです。ありがとう! – x3mspeedy