为什么这段简单代码中的析构函数
~TestClass()
被调用了两次?
#include <memory>
#include <iostream>
#include <vector>
class TestClass
{
int m_val;
public:
TestClass(int val);
~TestClass();
};
TestClass::TestClass(int val) : m_val(val)
{
std::cout << this << " TestClass() " << m_val << "\n";
}
TestClass::~TestClass()
{
std::cout << this << " ~TestClass() " << m_val << "\n";
m_val = -1;
}
int main()
{
auto x = std::make_unique<TestClass>(2);
auto y = *x; // <<<< this triggers it
}
输出
000001E66C0B5980 TestClass() 2
00000057FDD9FAB4 ~TestClass() 2 // why is the destructor called here?
000001E66C0B5980 ~TestClass() 2
自动 y = *x; // <<<< this triggers it
上面是复制初始化并且将使用类的复制构造函数。您看到的额外析构函数调用对应于该对象
y
。您还可以通过向您的类添加复制向量来验证这一点,您会注意到复制向量用于使用 y
创建 *x
。
TestClass::TestClass(const TestClass& p): m_val(p.m_val)
{
std::cout << this << " TestClass(p) " << m_val << "\n";
}
添加检测的复制构造函数有助于:
TestClass::TestClass(const TestClass& p)
{
m_val = p.m_val;
std::cout << this << " TestClass(p) " << m_val << "\n";
}
新输出:
0000022150357D10 TestClass() 2
000000F489EFF894 TestClass(p) 2
000000F489EFF894 ~TestClass() 2
0000022150357D10 ~TestClass() 2