2017-11-25 25 views
3

std::unique_ptrを持つ中間オブジェクトをmeメンバにアクセスするための「OK」の方法は、meですか?ここrvalueデストラクタが呼び出されたか/これはokです

は、例えば

#include <iostream> 
#include <memory> 

/* myobj from another library */ 
class myobj { 
public: 
    std::string me; /* actual member of interest is larger and more 
         complicated. Don't want to copy of me or myobj */ 

    /* more members in actual class */ 

    myobj(std::string i_am) { 
     /* more stuff happens in constructor */ 
     me = i_am; 
    } 

    ~myobj(){ 
     std::cout << me << ": Goodbye" << std::endl; 
    } 
}; 

/* A function in another library */ 
void who_is_this(std::string *who){ 
    std::cout << "This is " << *who << std::endl; 
} 

/* wrapper which I define */ 
class myobj_wrapper { 
    using obj_ptr = std::unique_ptr<myobj>; 
    obj_ptr ptr; 

public: 
    std::string *who; 

    myobj_wrapper(std::string i_am): 
     ptr(new myobj(i_am)), who(&ptr.get()->me) {} 

    myobj_wrapper(myobj &the_obj): who(&the_obj.me) { } 
}; 

int main() 
{ 
    { 
     myobj bob("Bob"); 
     who_is_this(myobj_wrapper(bob).who); 
    } 

    who_is_this(myobj_wrapper("Alice").who); 

    return 0; 
} 

で得られたプログラム収率

This is Bob 
Bob: Goodbye 
This is Alice 
Alice: Goodbye 

Iはwhoポインタを取得するために、複数のオブジェクトのmyobj_wrapperを定義します。関心のあるオブジェクト(上記のstd::string)がwho_is_this関数で評価される前に破棄されるかどうかわかりません。 それは上記のようには見えませんが、私はこれを期待する必要がありますか?上記の解決策に落とし穴がありますか?

+0

コード私は練習のポイントをよく理解していないことを認めなければなりませんが、これはおそらくこれがsoluti 〜に。 –

+0

** rvalueデストラクタ**はどういう意味ですか? –

+0

これは、 'who_is_this(myobj_wrapper(" Alice "))の動的に割り当てられたオブジェクトを意味します; who: –

答えて

1

は、私はわかりませんが、ここで私の視点は次のとおりです。

who_is_this(myobj_wrapper("Alice").who); 

これは、引数として文字列リテラルを取るラッパーオブジェクトを作成します。次に、myobjインスタンスが動的に作成され、一意のポインタに引き渡されます。そのインスタンスを介して、データ(文字列)を取得し、ラッパークラスから従来のポインターをポイントします。だから今whome、つまりアリスを指しています。

我々が(ポインタである)whoを渡す:

void who_is_this(std::string *who) 

関数のパラメータwhoないコピーが、元のデータを指していることを意味します。

これで、ラッパーオブジェクトがスコープから外れる(つまり、データメンバ(一意のポインタ)もスコープから外れる)ことが問題になります。つまり、動的に作成されたmyobjインスタンスがガベージコレクションされます、ターンでmeがあまりにも範囲の外に行こう、とwho_is_this()はあなたのコードがOKであることを意味し、実行されます後にそうwho

ラッパーオブジェクトは、スコープの外に行くだろうことを意味します。

+0

" ** who_is_this()が実行された後、**ラッパーオブジェクトは範囲外になります。コードはOKです。 "クール、答えてくれてありがとう! –

+1

Thx。私は誰かが落とし穴についてのコメントを追加するかもしれないと考えました。私はないと思います。具体的な例は、Armadilloライブラリを使用している[here](https://github.com/boennecd/dynamichazard/blob/master/src/problem_data.h)です。 'map_res'クラス、例えば' lp_map'メソッドを見てください。新しい 'arma :: vec'が必要な場合もあれば、新しいオブジェクトを作成する必要がない場合もあります。 (クラスの上のコメントを無視する - それは間違っている)。 –

関連する問題