2015-11-03 84 views
1

是否有可能在禁止例外情况下使用allocate_sharedfno-exceptions),并且分配器返回nullptr而不是抛出分配失败?这意味着有一个围绕allocate_shared的包装,当内存分配失败时返回一个空的shared_ptr。我正在寻找能够与GCC(libstdC++),Clang(libC++)和MSVC一起工作的东西。allocate_shared当例外情况被禁止时

当前想法:对控制块的大小设置一些上限,并且如果可以预先分配足够的内存(对于控制块加对象),则只调用allocate_shared

回答

0

我想,你的构造函数从来不会抛出,因为你处于“无例外”环境。那么你的分配器也必须如此。然后根据this documentationallocate_shared()不会抛出。一个空的shared_ptrshared_ptr完全一样,所以不需要在这里创建任何包装或东西。

所以是的,你可以使用它,虽然我建议尝试让“没有例外” - 限制。我从来没有发现任何地方有这样的限制的真正理由。

+1

您从文档中推断得太多。标准分配器不应该返回'nullptr',所以'allocate_shared()'不能解决这种情况。在实践中,您将获得非法访问而不是空的'shared_ptr'。 –

+0

'allocate_shared()'不应该考虑到这种情况。我想,你想确定的是,构造函数永远不会被指向空指针。那么,'allocate_shared()'将使用'allocator_traits :: construct()'。所以只需要为你的自定义分配器专门设置'allocator_traits',你就会好起来的。 – cdonat

+0

我想过这样做,但根据N4140§20.8.2.2.6:'allocate_shared' _分配适合于类型T的对象的内存,并通过放置新表达式构建一个对象 ':: new(pv )T(std :: forward (args)...)'_。 –