静态变量析构函数

Static variable destructor

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

class Test2 {
 public:
 Test2() { std::cout << "TEST2 Constructor\n"; } 
 ~Test2() { std::cout << "TEST2 Destructor\n"; }  
};

class Test {
 public:
 static Test2& get() { static Test2 test{}; return test; }
};

int main()
{
    auto test = Test::get();
    std::cout << "Created\n";
    
    auto test1 = Test::get();
    std::cout << "Created\n";
    
    auto test2 = Test::get();
    std::cout << "Created\n";    
}

我有这样的输出:

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

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

testtest1test2 都是 Test 的实例,它们在 main 结束时如预期的那样被销毁。您没有看到它们被构造,因为您没有检测用于初始化它们的移动构造函数。

析构函数被调用了 4 次,因为创建了 4 个对象。这个说法

auto test1 = Test::get();

调用Testclass的拷贝构造函数。您可以通过使用带有 cout 语句的复制构造函数来验证。 auto 解析为 Test 而不是 Test&。如果要获取对象的引用,就得显式的说

auto& test1 = Test::get();

如果您要为 destructor/copy/move 构造函数定义自己的实现,请始终遵循 Rule of 3/5/0