をunique_ptrをするために、既に作成されたオブジェクトに変換するために、私はmyObject
と呼ばれるタイプMyClass
のオブジェクトを返すget
機能があります:私はそれを行う方法、uniqe_ptr
にmyObjectというを変換したいC++方法
MyClass myObject = something.get(id);
を?
std::unique_ptr<MyClass>(&myObject); //Is this correct?
をunique_ptrをするために、既に作成されたオブジェクトに変換するために、私はmyObject
と呼ばれるタイプMyClass
のオブジェクトを返すget
機能があります:私はそれを行う方法、uniqe_ptr
にmyObjectというを変換したいC++方法
MyClass myObject = something.get(id);
を?
std::unique_ptr<MyClass>(&myObject); //Is this correct?
MyClass myObject = something.get(id);
は建設をコピーまたは移動のいずれかを意味します。
あなたのコピーコンストラクタを定義して、新しいオブジェクトを作成し、コピーして、それを初期化し、次の
std::unique_ptr<MyClass> my_p_obj(new MyClass(myObject));
を試し公共宣言されている場合。
は、そうでなければ、あなたの例では、オブジェクトが移動建設を通じて初期化されるのstd :: unique_ptrを(& myObjectという)と間違って何std::unique_ptr<MyClass> my_p_obj(new MyClass(std::move(myObject)));
。
myObject
は、それが中にある機能が終了(}
)に達したときに破壊されるローカルスコープ内のオブジェクトです。デストラクタを2回呼び出すと(コンパイラから1つで、unique_ptr
から2番目のもの)、未定義の動作が発生します。
編集:コメント内でクリアされているように、同じことを行うauto my_p_obj = std::make_unique<MyClass>(myObject)
を使用できます。 - ありがとう、アンドレアスH.
また、 'auto my_p_obj = std :: make_unique
@AndreasH。、 'make_unique'とコピーコンストラクタを通して' unique_ptr'を作ることが可能かどうかは確かではありませんでした。それをクリアしていただきありがとうございます。私は答えを編集しました。 – GeorgeAl
リファレンスで初期化すると、スコープから外れると問題が発生します。一つの可能性:
// Example program
#include <iostream>
#include <string>
#include <memory>
struct MyClass
{
};
int main()
{
MyClass myObject;
std::unique_ptr<MyClass>(new MyClass(myObject));
}
コピーコンストラクタが削除された場合はどうなりますか? – user3828398
@ user3828398あなたは 'std :: move'することができますか? –
'std :: unique_ptr
'unique_ptr'が範囲外になり、' new'で割り当てられたものを指していないポインタを 'delete'しようとします。 –
@GeorgeAlそういうわけで 'std :: unique_ptr(myObject);'? –
user3828398
確かに、そうではありません。 unique_ptrは、ヒープで割り当てられたオブジェクトのためのものです – user3159253