2015-11-03 36 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)...)'_。 –