为什么该类的析构函数被调用两次? shared_ptrs

问题描述 投票:0回答:1
 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

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

destructor shared-ptr
1个回答
0
投票

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

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

总而言之,Class C;使用堆栈存储器,而std::shared_ptr<Class> ptr(&C);使用堆存储器。

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

然后共享指针自动在堆中删除其对象,因此将调用其对应的析构函数。

因此有两个析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.