2012-07-24 91 views
9

我有一個結構:鑄造的shared_ptr <T>到shared_ptr <void>

struct Params { 
    std::shared_ptr<void> user_data; 
    /* ... */ 
}; 

我想用這樣的:

int main() { 
    std::shared_ptr<SpecializedParams> sp(new SpecializedParams(100)); 
    Params params; 
    /* ... */ 
    params.user_data = std::static_pointer_cast<void>(sp); 
    /* ... */ 
    std::shared_ptr<SpecializedParams> sp2 = 
    std::static_pointer_cast<SpecializedParams>(
     params.user_data 
    ); 
    /* ... */ 
    return 0; 
} 

這是有效和安全的?

+0

什麼是主要區塊的參數? – 2012-07-24 04:40:38

+0

你不能'刪除'一個空指針,所以你的代碼甚至不應該編譯。 – 2012-07-24 05:52:14

+2

@KerrekSB共享void指針無疑是有效的。在這裏看到更多的細節:http://stackoverflow.com/questions/5913396/why-do-stdshared-ptrvoid-work – 2012-07-24 06:26:15

回答

7

實際刪除共享對象的代碼是在創建共享指針時確定的(這就是爲什麼在構建shared_ptr時需要完整類型,而不是在破壞shared_ptr時需要的類型)。因此,即使你的shared_ptr是指向你的SpecializedParams對象的最後一個指針,該對象也會被正確銷燬。

3

這應該是安全的,因爲虛構鑄造物品也是shared_ptr。它會添加一個對現有元素的引用,並且直到無效投射項目消失纔會被釋放。

+2

它工作的原因是隱藏的deleter函數與'shared_ptr '對象存儲在一起......否則,僅僅對'void'指針調用'delete'將無法正確釋放由' shared_ptr '。 – Jason 2012-07-24 12:29:10

相關問題