(私の質問への回答にはコピー コンストラクターが含まれますが、コピーは別のクラスへのメソッド呼び出し内ではなく、関数からの戻り時に行われます。参照されている可能性のある重複を実際に見ましたが、vector によって作成されたコピーから推測しませんでした::ここにある私の関数もコピーを作成したことを push_back します。
自動オブジェクトの構築/破壊を理解しようとしています。疑わしいと思われるコードに出くわしたので、それを理解するために独自のバージョンを作成しました。つまり、元のコードには、関数に対してローカルなオブジェクト (自動オブジェクト) を返す関数が含まれていました。それは私には安全ではないように見えたので、それを調べるためにこのプログラムを書きました:
#include <stdio.h>
class Phantom
{
private:
static int counter;
int id;
public:
Phantom()
{
++counter;
id = counter;
printf("Phantom %d constructed.\n", id);
};
virtual ~Phantom()
{
printf("Phantom %d destructed.\n", id);
};
void speak()
{
printf("Phantom %d speaks.\n", id);
};
};
int Phantom::counter = 0;
Phantom getPhantom()
{
Phantom autoPhantom;
return autoPhantom; // THIS CAN'T BE SAFE
}
int main()
{
Phantom phantom;
phantom = getPhantom();
phantom.speak();
return 0;
}
私はこの出力を得ます:
ファントム1号建造。 ファントム2号建造。 ファントム 2 が破壊されました。 ファントム 2 が破壊されました。 ファントム 2 がしゃべります。
私を混乱させるのは、出力の 4 行目です。
ファントム 1 はmain
を入力すると自動的に構築されます。
ファントム 2 は、getPhantom
入力すると自動的に構築されます。
Phantom 2 は終了時に自動的に破棄されますgetPhantom
(これが、Phantom 2 からの復帰getPhantom
が安全ではないと私が信じている理由です)。
しかし、その後、私は混乱しています。デバッガーによると、出力の 4 行目が表示される前getPhantom
に戻ってきました。のデストラクタが 2 回目に呼び出されると、コール スタックは次のようになります。Phantom
主要 〜ファントム
管理された言語では、次の行がどのように表示されるかを確認できました。
phantom = getPhantom();
Phantom 1 は破壊されますが、Phantom 2 には影響しません。これは C++ であり、Java ではありません。
Phantom 2 のデストラクタへの 2 回目の呼び出しの原因は何ですか?