2012-07-24 13 views
9

をshared_ptrのために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

メインブロックのparamsとは何ですか? –

+0

voidポインタを 'delete'することはできないので、あなたのコードはコンパイルすべきではありません。 –

+2

無効なKerrekSB共有ポインタは確かに有効です。詳細については、ここを参照してください:http://stackoverflow.com/questions/5913396/why-do-stdshared-ptrvoid-work –

答えて

7

実際に共有オブジェクトを削除するコードは、共有ポインタが作成されたときに決定されます(shared_ptrを構築するときに完全な型が必要な理由です)。したがって、shared_ptrがSpecializedParamsオブジェクトを指す最後のポインタであっても、オブジェクトは正しく破棄されます。

3

void castedアイテムもshared_ptrであるため、これは安全です。それは既存の要素への参照を追加し、void castedアイテムがなくなるまで解放されません。

+2

その理由は、 'shared_ptr 'オブジェクトで保存されているhidden deleter関数が原因です。そうでなければ、単に 'void'ポインタで' delete'を呼び出すだけでは、管理されているオブジェクトのメモリリソースを ' shared_ptr '。 – Jason

関連する問題