C++的new运算符有一个选项,当分配失败时可以返回一个空指针而不是抛出bad_alloc异常。
Foo * pf = new(std::nothrow) Foo(1, 2, 3);
是的,我理解这只能防止新对象抛出bad_alloc异常,但它不能防止Foo构造函数抛出异常。
如果你想使用shared_ptr而不是裸指针,通常应该使用make_shared,因为它在控制块的分配方面更加聪明。
auto pf = std::make_shared<Foo>(1, 2, 3);
make_shared封装了new操作,这使得无法选择nothrow版本。因此,似乎必须放弃使用make_shared并显式调用new。
std::shared_ptr<Foo> pf(new(std::nothrow) Foo(1, 2, 3));
这样做就可以避免使用Foo和控制块进行优化,而且控制块的分配可能会独立于Foo的分配失败,但我不想关注这一点。假设控制块很小,因此在实践中其分配永远不会失败。我担心的是无法为Foo分配空间。
有没有一种方法可以保留make_shared的单次分配优势,同时保留仅获得空指针而不是bad_alloc异常的能力来分配Foo的空间?
make_shared
的代码,然后根据需要进行修改。 - Remy Lebeau