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/