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
超出范围,因此调用了析构函数。
然后共享指针自动在堆中删除其对象,因此将调用其对应的析构函数。
因此有两个析构函数。