2016-05-12 5 views
0

をunique_ptrをするために、既に作成されたオブジェクトに変換するために、私はmyObjectと呼ばれるタイプMyClassのオブジェクトを返すget機能があります:私はそれを行う方法、uniqe_ptrにmyObjectというを変換したいC++方法

MyClass myObject = something.get(id); 

を?

std::unique_ptr<MyClass>(&myObject); //Is this correct? 
+1

'unique_ptr'が範囲外になり、' new'で割り当てられたものを指していないポインタを 'delete'しようとします。 –

+0

@GeorgeAlそういうわけで 'std :: unique_ptr (myObject);'? – user3828398

+0

確かに、そうではありません。 unique_ptrは、ヒープで割り当てられたオブジェクトのためのものです – user3159253

答えて

5
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.

+1

また、 'auto my_p_obj = std :: make_unique (myObject)'を使うこともできます。これは 'std :: unique_ptr my_p_obj(new MyClass(myObject))'と基本的に同じです。 –

+1

@AndreasH。、 'make_unique'とコピーコンストラクタを通して' unique_ptr'を作ることが可能かどうかは確かではありませんでした。それをクリアしていただきありがとうございます。私は答えを編集しました。 – GeorgeAl

0

リファレンスで初期化すると、スコープから外れると問題が発生します。一つの可能​​性:

// Example program 
#include <iostream> 
#include <string> 
#include <memory> 

struct MyClass 
{ 
}; 

int main() 
{ 
    MyClass myObject; 
    std::unique_ptr<MyClass>(new MyClass(myObject)); 
} 
+0

コピーコンストラクタが削除された場合はどうなりますか? – user3828398

+2

@ user3828398あなたは 'std :: move'することができますか? –

+0

'std :: unique_ptr (&myObject);の何が問題なのですか? – user3828398