如果我理解正确,当一个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的构造函数是否负责删除对象?
答案 0 :(得分:7)
即使my_class
无法分配内存,您的代码也不会泄漏shared_ptr
对象。
根据C ++ 11标准(20.7.2.2.1),在shared_ptr
构造函数中:
抛出:bad_alloc,或者当内存以外的资源时实现定义的异常 无法获得。
异常安全:如果抛出异常,则调用delete p。
在采用用户定义的删除器的构造函数版本中,将使用删除器。
Boost documentation指定相同的内容。