下面的C ++ shared_ptr用法会不会有任何泄漏?

时间:2016-11-29 05:18:54

标签: c++ c++11 smart-pointers

智能指针管理的分配内存是否可以保证在异常情况下被释放,例如下面的内容?

#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析构函数中,但我没有看到它被调用。我认为应该自己清理内存。我是对的,还是不会被清理干净?

2 个答案:

答案 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中进行调试并在异常之后继续说,那么甚至析构函数也会被调用。