静态变量析构函数
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 实例吗?
test
、test1
和 test2
都是 Test
的实例,它们在 main
结束时如预期的那样被销毁。您没有看到它们被构造,因为您没有检测用于初始化它们的移动构造函数。
析构函数被调用了 4 次,因为创建了 4 个对象。这个说法
auto test1 = Test::get();
调用Test
class的拷贝构造函数。您可以通过使用带有 cout
语句的复制构造函数来验证。 auto
解析为 Test
而不是 Test&
。如果要获取对象的引用,就得显式的说
auto& test1 = Test::get();
如果您要为 destructor/copy/move 构造函数定义自己的实现,请始终遵循 Rule of 3/5/0。
我想知道为什么我有这样的代码:
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 实例吗?
test
、test1
和 test2
都是 Test
的实例,它们在 main
结束时如预期的那样被销毁。您没有看到它们被构造,因为您没有检测用于初始化它们的移动构造函数。
析构函数被调用了 4 次,因为创建了 4 个对象。这个说法
auto test1 = Test::get();
调用Test
class的拷贝构造函数。您可以通过使用带有 cout
语句的复制构造函数来验证。 auto
解析为 Test
而不是 Test&
。如果要获取对象的引用,就得显式的说
auto& test1 = Test::get();
如果您要为 destructor/copy/move 构造函数定义自己的实现,请始终遵循 Rule of 3/5/0。