3

私が次のことをすると、

int* p = new int(10);
std::shared_ptr<int>(p);
delete p;

そこで何が起こるの?shared_ptr生ポインタの削除後は無効ですか?このようなシナリオでメモリ アクセスの安全性を確保する方法はありますか?

4

1 に答える 1

6

あなたの質問のコードには、 の 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);

于 2015-06-09T04:45:46.250 に答える