1
是否有可能在禁止例外情况下使用allocate_shared
(fno-exceptions
),并且分配器返回nullptr
而不是抛出分配失败?这意味着有一个围绕allocate_shared
的包装,当内存分配失败时返回一个空的shared_ptr
。我正在寻找能够与GCC(libstdC++),Clang(libC++)和MSVC一起工作的东西。allocate_shared当例外情况被禁止时
当前想法:对控制块的大小设置一些上限,并且如果可以预先分配足够的内存(对于控制块加对象),则只调用allocate_shared
。
您从文档中推断得太多。标准分配器不应该返回'nullptr',所以'allocate_shared()'不能解决这种情况。在实践中,您将获得非法访问而不是空的'shared_ptr'。 –
'allocate_shared()'不应该考虑到这种情况。我想,你想确定的是,构造函数永远不会被指向空指针。那么,'allocate_shared()'将使用'allocator_traits :: construct()'。所以只需要为你的自定义分配器专门设置'allocator_traits',你就会好起来的。 –
cdonat
我想过这样做,但根据N4140§20.8.2.2.6:'allocate_shared' _分配适合于类型T的对象的内存,并通过放置新表达式构建一个对象 ':: new(pv )T(std :: forward(args)...)'_。 –