析构函数意外调用

问题描述 投票:0回答:2

为什么这段简单代码中的析构函数

~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
c++ smart-pointers unique-ptr
2个回答
1
投票

自动 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";
}

1
投票

添加检测的复制构造函数有助于:

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
© www.soinside.com 2019 - 2024. All rights reserved.