2012-07-24 92 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

相关问题