c++ 析构函数意外调用

jc3wubiy  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(72)

为什么在这段简单的代码中析构函数~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

ctrmrzij

ctrmrzij1#

auto y = *x;//<这会触发它
上面是copy initialization,并将使用类的copy构造函数。您看到的额外析构函数调用对应于此对象y。您也可以通过向类添加复制ctor来验证这一点,您会注意到复制ctor用于使用*x创建y

class TestClass
{
  int m_val;

public:
  TestClass(int val);
  ~TestClass();
   //added this copy ctor
  TestClass(const TestClass &p): m_val(p.m_val)
//-------------------------------^^^^^^^^^^^^^^--->use member initializer list
  {
      std::cout << this << " copy ctor " << m_val << "\n";
  }
};
//other code as before

字符串

相关问题