web-dev-qa-db-ja.com

std :: shared_ptrがdelete()を呼び出さないようにする方法

Std :: shared_ptrを引数として受け取る関数があるため、std :: shared_ptrを使用せざるを得ませんが、関数に渡すオブジェクトは動的に割り当てられません。オブジェクトをstd :: shared_ptrでラップし、std :: shared_ptrでdeleteを呼び出さないようにするにはどうすればよいですか。

30
Ken Li
MyType t;
nasty_function(std::shared_ptr<MyType>(&t, [](MyType*){}));
40
ronag

共有ポインターを作成するときに、no-op deleterを指定します。例えば。このような:

void null_deleter(MyType *) {}

int main()
{
  MyType t;
  nasty_function(std::shared_ptr<MyType>(&t, &null_deleter));
}
26
Angew

これを行う最良の方法は、エイリアシングコンストラクターを使用することです。

nasty_function(std::shared_ptr<MyType>(std::shared_ptr<MyType>{}, &t));

Null削除アプローチと比較すると、これは制御ブロックを割り当てる必要がなく、noexceptです。

@ Casey および @ Nevin で述べられているように、これは、関数が共有所有権を取得しようとしないことが確実である場合、またはオブジェクトが存続する場合にのみ実行する必要がありますそれを「所有する」かもしれないすべてのもの。

15
T.C.