静态变量析构函数



我想知道为什么如果我有这样的代码:

class Test2 {
public:
Test2() { std::cout << "TEST2 Constructorn"; } 
~Test2() { std::cout << "TEST2 Destructorn"; }  
};
class Test {
public:
static Test2& get() { static Test2 test{}; return test; }
};
int main()
{
auto test = Test::get();
std::cout << "Createdn";

auto test1 = Test::get();
std::cout << "Createdn";

auto test2 = Test::get();
std::cout << "Createdn";    
}

我有这样的输出:

> TEST2 Constructor 
> Created 
> Created 
> Created 
> TEST2 Destructor 
> TEST2 Destructor 
> TEST2 Destructor 
> TEST2 Destructor

为什么析构函数被调用四次?不是应该只有一个测试实例吗?

析构函数被调用了 4 次,因为创建了 4 个对象。此声明

auto test1 = Test::get();

调用Test类的复制构造函数。可以通过使用带有cout语句的复制构造函数进行验证。auto决心TestTest&。如果要获取对象的引用,则必须明确说明

auto& test1 = Test::get();

如果您正在为析构函数/复制/移动构造函数定义自己的实现,请始终遵循 3/5/0 规则。

testtest1test2都是Test的实例,它们在main结束时被破坏。您看不到构造它们,因为您没有检测初始化它们的移动构造函数。

相关内容

最新更新