2016-04-19 6 views
-4

明らかに、私はむしろstd::shared_ptr<T>またはstd::unique_ptr<T>を使用したいと思いますが、私は98/03のレガシーコードを扱っています。ポインタを返すとどうなりますか?

私の状況は次のとおりです。

SomeObject.ReturnPtr() -> SomeFunction(); 

一時的なポインタは自動的に削除されますん。私がしなければ

auto* SomeClass::ReturnPtr(void) 
{ 
    return this -> UniquePtrObject.get(); 
}; 

どうなりますか?または私は実際に漏れを引き起こしていますか?

これは、の値ポインタのような表現を考えています。 Rvalueポインタは意味をなさないのですか?

+7

戻り値の型が 'auto *'のレガシーコードですか? – Steephen

+0

「一時ポインタ」とは何ですか?あなたはポインタを返すだけです。その行動は変わらなかった。 –

+2

上記のコメントの上に、ちょうどメモ、 ' - >'または '。の前後に空白を入れないでください。 – Nacho

答えて

2

(または任意のresetその上で行われます)。

したがってSomeObject.ReturnPtr()->SomeFunction()が有効です。

しかし、ダングリングポインタになります以下:SomeObjectの生涯と

auto* createDanglingPointer() 
{ 
    SomeClass SomeObject = MakeSomeClass(); 

    return SomeObject.ReturnPtr(); 
} 

は、スコープの終わりで終了します。

+0

お返事ありがとうございます。乾杯。 –

-2

一時的なポインタは本当に危険です。以前にポインティングしていたデータのスコープが終了すると、ポインターがぶら下がり、プログラムがアクセスできないランダムな場所にアクセスしようとするため、ポインターが解放されます。それは間違った結果を与えるかもしれません、値またはプログラムは例外違法アクセスで終了するかもしれません。

auto* SomeClass::ReturnPtr() 
{ 
    return this->UniquePtrObject.get(); 
} 

あなたのポインタは限りUniquePtrObjectがあるとして有効であると

関連する問題