智能指针管理的分配内存是否可以保证在异常情况下被释放,例如下面的内容?
#include <memory>
void test( std::shared_ptr<int> sptr )
{
throw "exception";
}
int main()
{
std::shared_ptr<int> ptr( new int(1) );
test( ptr );
return 0;
}
我尝试执行代码,将断点放在shared_ptr
析构函数中,但我没有看到它被调用。我认为应该自己清理内存。我是对的,还是不会被清理干净?
答案 0 :(得分:6)
语言标准规定:
如果找不到匹配的处理程序,则函数
std::terminate()
为 所谓的;在此调用之前是否展开堆栈std::terminate()
是实现定义的
因此,您的程序无法保证自行清理,但大多数(如果不是全部)现代操作系统都会在事后进行清理。
如果您发现异常,shared_ptr
的实例将被正确销毁,确保没有泄漏。
答案 1 :(得分:0)
以更好的理例来理解:
#include <memory> #include <windows.h> using namespace std; class A { public: A() { cout << "Constructor" << endl; } ~A() { cout << "destructor" << endl; } }; void test(std::shared_ptr<A> sptr) { throw "exception"; } void function() { std::shared_ptr<A> ptr(new A); test(ptr); } int main() { function(); Sleep(5000); }
在程序崩溃之前,只有一个构造函数被调用,这表明它不会破坏。 但是如果我们在visual studio中进行调试并在异常之后继续说,那么甚至析构函数也会被调用。