如果shared_ptr的构造函数失败会发生什么?

byt*_*uff 8 c++ memory-management smart-pointers

如果我理解正确的话,当一个shared_ptr(来自boost,tr1,std,等等)用一个指向新分配对象的指针初始化时,shared_ptr的构造函数会分配少量内存来保存它管理的指针的引用计数.如果分配失败会怎么样?在以下代码中:

class my_class {};
void my_func(shared_ptr<my_class> arg);

int main(int argc, char* argv[])
{
    my_func(shared_ptr<my_class>(new my_class()));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

... my_class如果shared_ptr无法为其引用计数分配内存,那么对象是否会泄露?或者shared_ptr的构造函数是否负责删除对象?

int*_*jay 7

my_class即使shared_ptr无法分配内存,您的代码也不会泄漏对象.

根据C++ 11标准(20.7.2.2.1),在shared_ptr构造函数中:

抛出:bad_alloc,或者当无法获得除内存之外的资源时,实现定义的异常.

异常安全:如果抛出异常,则调用delete p.

在采用用户定义的删除器的构造函数版本中,将使用删除器.

Boost文档指定相同.