簡體   English   中英

有什么辦法可以欺騙std :: make_shared使用默認初始化嗎?

[英]Is there any way to trick std::make_shared into using default initialization?

您應該使用std::make_shared來確保帶有計數器的塊存儲在數據旁邊。 不幸的是,內部std::make_shared<T>T使用零初始化(即,使用T()初始化數據塊)。 有什么辦法誘使它使用默認初始化嗎? 我知道我可以使用std::shared_ptr<T>( new T, [](auto p){delete p;}) ,但是在這里我將得到兩個分配(數據塊和計數器塊不會緊挨着彼此)。

創建派生類以強制執行瑣碎的構造。

struct D : T {
    D() {} // Non-trivial constructor. Default-initialize T, which may be trivial.
};

構造派生類,但將其分配給所需的共享指針。

std::shared_ptr< T > p = std::make_shared< D >();

演示

請注意,這對於析構函數是類型安全的。 shared_ptr始終執行類型擦除,並在析構函數調用之前使用動態分配,即使對於簡單的POD對象也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM