答えが見つからない単純な初心者の質問があります。
C ++では、通常のオブジェクトをどのように変換しますか
int i;
にstd::unique_ptr
?
std::unique_ptr<int> iptr = &i; //invalid
std::unique_ptr<int> iptr = static_cast<std::unique_ptr<int>>(&i); //invalid
ありがとう。
答えが見つからない単純な初心者の質問があります。
C ++では、通常のオブジェクトをどのように変換しますか
int i;
にstd::unique_ptr
?
std::unique_ptr<int> iptr = &i; //invalid
std::unique_ptr<int> iptr = static_cast<std::unique_ptr<int>>(&i); //invalid
ありがとう。
あなたはそうしない。そのオブジェクトは によって削除できません。delete
これは、unique_ptr
が実行しようとしていることです。あなたが必要
auto iptr = make_unique<int>();
ここで、make_unique を make_shared と同一のユーティリティ関数として定義します。これは標準である必要がありますが、残念ながら見落とされていました。実装の概要は次のとおりです。
template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
あなたはそうしない。i
動的に割り当てられていないため、削除する必要はありません。そのアドレスをスマート ポインターでラップするとdelete &i
、ある時点でそれが実行され、未定義の動作が発生します。new
次のように、スマート ポインターで編集したものだけをラップする必要があります。
std::unique_ptr<int> ptr(new int(5));
スマート ポインターの要点は、動的に割り当てられたオブジェクトの有効期間を管理することです。i
自動保存期間があるため、スコープの最後に破棄されます。それを手伝ってくれるものは何も必要ありません。
私はこれがうまくいくと信じています:
int i;
auto deleter = [](int *ptr){};
std::unique_ptr<int, decltype(deleter)> iptr(&i, deleter);
何もしないカスタムのデリータを提供する必要があります。デフォルトのデリータは、によって割り当てられていない自動変数を削除できませんnew
。(ただし、これはスマート ポインターを使用する目的に反しますが、それが可能であることを示しています)。
unique_ptr が破棄されるとどうなりますか? または、変数がスコープ外になったときは?実際には意味がない