【发布时间】:2014-04-26 00:21:00
【问题描述】:
C++ 的 new 有一个选项可以在分配失败时返回空指针而不是抛出 bad_alloc 异常。
Foo * pf = new(std::nothrow) Foo(1, 2, 3);
(是的,我知道这只会阻止 new 抛出 bad_alloc;它不会阻止 Foo 的构造函数抛出异常。)
如果您想使用共享指针而不是原始指针,您通常应该使用 make_shared,因为它可以巧妙地分配控制块。
auto pf = std::make_shared<Foo>(1, 2, 3);
make_shared 封装了新版本,这使得(?)无法选择 nothrow 版本。因此,您似乎必须放弃 make_shared 并明确调用 new。
std::shared_ptr<Foo> pf(new(std::nothrow) Foo(1, 2, 3));
这消除了使用 Foo 分配控制块的优化,并且控制块分配可能会独立于 Foo 分配而失败,但我不想关注这一点。让我们假设控制块很小,因此它的分配在实践中永远不会失败。我担心的是未能为 Foo 分配空间。
有没有办法获得 make_shared 的单一分配优势,同时在为 Foo 分配空间时保留简单地获取空指针而不是 bad_alloc 异常的能力?
【问题讨论】:
-
您可能需要复制
make_shared的代码,然后根据需要进行修改。
标签: c++ make-shared nothrow