9

私は構造を持っています:

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;
}

これは有効で安全ですか?

4

2 に答える 2

8

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

于 2012-07-24T06:56:00.480 に答える
3

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

于 2012-07-24T04:55:05.587 に答える