2016-06-30 9 views
8

オブジェクトをローカルでインスタンス化して値で返すファクトリメソッドを書くと、NRVO(ここではいくつかの答えに応じて:c++11 Return value optimization or move?)を利用しようとすると、ポインタ/ローカルオブジェクトへの参照は、メソッドの戻り値が割り当てられているオブジェクトを指していますか?使用の際にNRVOで返され​​たオブジェクトへのポインタの格納

Object ObjectBuilder::BuildObject(void) 
{ 
    Object obj; 

    //this->ObjectReference = obj; //Disregard this 
    //OR 
    this->ObjectPtr = &obj; 

    return obj; 
} 

ObjectBuilder builder; 

Object newObject = builder.BuildObject(); 

はbuilder.ObjectPtrはでnewObjectを参照していますか?

+1

これはUBです。何かが起こる可能性があります。 – lorro

+2

C++ 17の保証されたコピーellisionを考慮しても、UndefinedBehavior Landへの無料チケットのようです。あなたの関数があなたがすると思われることをしても、あなたの 'ObjectBuilder'がそれにアクセスする限り、呼び出し元がオブジェクトの存続期間をどのように維持することを保証しますか? – KABoissonneault

+0

C++の17(N)RVOが保証されていれば、これは実際に有効であるかもしれません。 – nwp

答えて

5

あなたはダングリングポインタを格納しています。

あなたのプログラムは、このポインタを使用すると、未定義の動作をします。

あなたの運命からあなたを救う便利な最適化はありません。

+2

同様に、コピーを返して、ぶら下がっているポインタを内部的に保持しています – KABoissonneault

+0

@KABoissonneault:Er、right :) –

+0

格納されたポインタの値が –

関連する問題