【发布时间】:2019-12-20 04:38:42
【问题描述】:
我写了一个小程序,检查通过new和make_shared()函数创建shared_ptr的区别,以防出现异常。我通过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;
}
【问题讨论】:
-
对象生命周期在构造函数成功完成时开始。如果构造函数抛出异常,则它没有被构造并且从未存在过,不是对象,不存在,并且不能被破坏。
-
@LightnessRacesinOrbit 哦,我期待链接后面有一些代码演示,但懒得打开它;)
-
@foreknownas_463035818 哈哈
-
这里有一个有趣的哲学观点:如果你破坏了一个不存在的对象,它是继续不存在,还是不再存在> :)
标签: c++ exception shared-ptr smart-pointers