c++ - 为什么类的析构函数被调用了两次?共享指针

标签 c++ shared-ptr destructor undefined-behavior object-lifetime

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

 int main() {
     std::cout<<"\nNew shared_ptr:\n";
     Class C;
     std::shared_ptr<Class> ptr(&C);
 }

运行后我有:

New shared_ptr: 
Constructor 
Destructor 
Destructor

这是为什么呢?为什么析构函数被调用两次?

最佳答案

C++ 中的原始指针存储对象的地址(指向对象),而 C++ 中的智能指针充当原始指针的包装器,具有自动删除功能。

虽然智能指针通常不会复制原始对象,但在您的情况下,您传递的是本地地址 C作为参数,因此是 C 的拷贝存储在堆中。

总结Class C;使用堆栈内存,而 std::shared_ptr<Class> ptr(&C);使用堆内存。

main() 的末尾功能,C超出范围,因此调用析构函数。

然后共享指针会自动删除它在堆中的对象,所以它对应的析构函数被调用。

因此有两个析构函数。

关于c++ - 为什么类的析构函数被调用了两次?共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44325508/

相关文章:

c++ - 为什么要使用 MultiByteToWideCharArray 将 std::string 转换为 std::wstring?

c++ - 重载 operator<< 和 operator+ 导致错误

c++ - 虚函数和纯虚函数的区别?

c++ - 动态分配的 int 数组的共享指针触发了断点

c++ - C++ 中的析构函数

C++ 如何触发类析构函数

c++ - 字符串数组转换为数字并排序

c++ - Shared_Ptr 影响了我的应用程序的性能

c++ - 共享指针和 const 正确性

c++ - 多级继承中的析构函数调用 (c++)