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

8

如果我理解正确,当使用指向新分配的对象的指针初始化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;
}

如果shared_ptr在分配其引用计数的内存失败时,my_class对象会泄漏吗?还是shared_ptr的构造函数负责删除对象?

1个回答

7

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

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

如果资源不是内存,则会抛出bad_alloc或实现定义的异常。

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

在接受用户定义删除器的构造函数版本中,将使用该删除器。

Boost文档说明了同样的内容。


谢谢。我确实使用了谷歌搜索,但没有找到答案。总有一天我会学会检查源代码 - 即标准。 :-) - bythescruff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接