6

答えが見つからない単純な初心者の質問があります。

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

ありがとう。

4

4 に答える 4

12

あなたはそうしない。そのオブジェクトは によって削除できません。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)...));
}
于 2012-12-25T21:19:15.997 に答える
5

あなたはそうしない。i動的に割り当てられていないため、削除する必要はありません。そのアドレスをスマート ポインターでラップするとdelete &i、ある時点でそれが実行され、未定義の動作が発生します。new次のように、スマート ポインターで編集したものだけをラップする必要があります。

std::unique_ptr<int> ptr(new int(5));

スマート ポインターの要点は、動的に割り当てられたオブジェクトの有効期間を管理することです。i自動保存期間があるため、スコープの最後に破棄されます。それを手伝ってくれるものは何も必要ありません。

于 2012-12-25T21:20:02.330 に答える
1

私はこれがうまくいくと信じています:

int i;
auto deleter = [](int *ptr){};
std::unique_ptr<int, decltype(deleter)> iptr(&i, deleter);

何もしないカスタムのデリータを提供する必要があります。デフォルトのデリータは、によって割り当てられていない自動変数を削除できませんnew。(ただし、これはスマート ポインターを使用する目的に反しますが、それが可能であることを示しています)。

于 2012-12-25T21:25:00.363 に答える
0

unique_ptr が破棄されるとどうなりますか? または、変数がスコープ外になったときは?実際には意味がない

于 2012-12-25T21:20:13.597 に答える