展开堆栈后,不会删除智能指针中的对象

Ole*_*leg 0 c++ exception smart-pointers shared-ptr

我编写了一个小程序,以检查异常情况下创建shared_ptrvia newmake_shared()函数之间的区别。我到处都读到,通过make_shared()它是异常安全的。

但是,这两种情况的有趣之处在于,两种情况下的析构函数都不会在堆栈展开后调用?我错过了什么吗?提前致谢。

#include <iostream>
#include <memory>

class Car
{
public:
    Car() { cout << "Car constructor!" << endl; throw std::runtime_error("Oops"); }
    ~Car() { cout << "Car destructor!" << endl; }
};

void doProcessing()
{
//    std::shared_ptr<Car> sp(new Car());
    std::shared_ptr<Car> sp2 = std::make_shared<Car>();
}

int main()
{
    try
    {
        doProcessing();
    }
    catch(...)
    {
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 12

什么东西

智能指针中的唯一对象实际上并未完成构造,因为其构造函数已抛出。它不存在。

您不需要智能指针来演示这一点。只要从任何构造函数中抛出,您就会看到未调用析构函数主体