私が次のことをすると、
int* p = new int(10);
std::shared_ptr<int>(p);
delete p;
そこで何が起こるの?shared_ptr
生ポインタの削除後は無効ですか?このようなシナリオでメモリ アクセスの安全性を確保する方法はありますか?
私が次のことをすると、
int* p = new int(10);
std::shared_ptr<int>(p);
delete p;
そこで何が起こるの?shared_ptr
生ポインタの削除後は無効ですか?このようなシナリオでメモリ アクセスの安全性を確保する方法はありますか?
あなたの質問のコードには、 の 2 つの矛盾する定義が含まれていますp
。私はあなたが何かを投稿するつもりだったと仮定しています
int* p = new int(10);
std::shared_ptr<int> p1(p);
delete p;
がshared_ptr
範囲外になり、その参照カウントがゼロになると、 が試行されdelete p;
、二重の削除と未定義の動作が発生します。
動的に割り当てられた の所有権を に渡したint
のでshared_ptr
、その仕事を任せて、自分自身を削除しようとしないでint
ください。
API のクライアントに上記のコードと同様の処理をさせたい場合、API 関数のパラメーターの型を からshared_ptr
コンストラクター引数のパラメーター パックに変更することが 1 つの可能性です。例えば
template<typename T, typename... Args>
void api_func(Args&&... args)
{
auto p = std::make_shared<T>(std::forward<Args>(args)...);
// Use the shared_ptr p as before
}
次に、 を渡す代わりにshared_ptr<int>
、クライアント コードは上記の関数を として呼び出しますapi_func<int>(10);
。