我的问题答案涉及到复制构造函数,但复制发生在函数返回时,而不是在对另一个类的方法调用中。我确实看到了参考可能会重复的内容,但没有推断出由vector :: push_back进行的复制也适用于我的函数。也许我应该使用。 我试图理解自动对象的构建/销毁。我遇到了一些看起来可疑的代码,因此我编写了自己的版本以便理解它。简而言之,原始代码包括一个返回函数的对象,该对象是函数局部的(自动)。这看起来不安全,所以我编写了这个程序来探究它:
我得到了这个输出:
幽灵1建造完毕。 幽灵2建造完毕。 幽灵2被销毁。 幽灵2被销毁。 幽灵2说话。
让我困惑的是输出中的第四行。
当进入 main 时,幽灵 1 会自动构造。
当进入 getPhantom 时,幽灵 2 会自动构造。
当退出 getPhantom 时,幽灵 2 会自动销毁(这就是为什么我认为从 getPhantom 返回它是不安全的原因)。
但在此之后,我感到困惑。根据调试器,在输出的第四行出现之前,getPhantom 已经返回。 当第二次调用 Phantom 的析构函数时,调用堆栈如下:
main ~Phantom
在一个托管语言中,我能理解:
#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说话。
让我困惑的是输出中的第四行。
当进入 main 时,幽灵 1 会自动构造。
当进入 getPhantom 时,幽灵 2 会自动构造。
当退出 getPhantom 时,幽灵 2 会自动销毁(这就是为什么我认为从 getPhantom 返回它是不安全的原因)。
但在此之后,我感到困惑。根据调试器,在输出的第四行出现之前,getPhantom 已经返回。 当第二次调用 Phantom 的析构函数时,调用堆栈如下:
main ~Phantom
在一个托管语言中,我能理解:
phantom = getPhantom();
虽然这段代码会摧毁Phantom 1,但不会影响Phantom 2。而且这是C++,不是Java。
是什么导致了对Phantom 2析构函数的第二次调用?