2016-10-20 5 views
3

*の代わりにget()*とするのはなぜですか?auto_ptrを使用しているときの* ptrと* ptr.get()の違いは何ですか?

は、次のコードを考えてみましょう:

auto_ptr<int> p (new int); 
*p = 100; 
cout << "p points to " << *p << '\n';   //100 

auto_ptr<int> p (new int); 
*p.get() = 100; 
cout << "p points to " << *p.get() << '\n'; //100 

結果はまったく同じです。 get()はより安全ですか?

+3

実際には違いはありません。 – Nawaz

+7

これはタグ付けされているため、C++ 11では 'std :: auto_ptr'は廃止され、C++で削除されます17。代わりに 'std :: unique_ptr'を使用してください。 –

+2

"get()はより安全ですか?" 'auto_ptr'を使うと、私の意見ではあなたのコード全体が安全でないものになります。それを使用しないでください。 –

答えて

6

実際には違いはありません。 *pの場合

、(auto_ptrによって定義される)過負荷operator*は、(メンバ関数によって行われること—を間接参照した後に)基礎となるオブジェクトへ参照を返す呼び出されます。しかし、後者の場合、p.get()は自分自身を逆参照する基になるポインタを返します。

あなたの質問にお答えしたいと思います。それはひどいなstd::unique_ptrstd::shared_ptrstd::weak_ptrと一緒に)など、他のスマートポインタに優先して、それも廃止されました—を設計されて今私は、std::auto_ptrを使用して回避にあなたをお勧めします。

4

効果的な違いはありません。 operator*は、*get()cppreference)を返すように定義されています。

auto_ptrの代わりに使用することを検討する必要があります。後者は現在のC++標準から削除されており、直感的ではありません。

5

*pは、auto_ptr::operator*を呼び出します。これはマネージドポインタを逆参照します。

*p.get最初にメソッドauto_ptr::getを呼び出します。このメソッドはマネージドポインタを返し、次にオペレータ*によって参照解除されます。

これは、一度実行すると同じ結果が得られます。つまり、管理ポインタが参照解除され、getを使用したときに追加のチェックは行われません。

auto_ptrは、C++ 11以降では非推奨です。

std::auto_ptr<int> p(new int(42)); 

{ 
    std::auto_ptr<int> copy_of_p(p); // ownership of *p is transfered here 

    // ... 

    p = copy_of_p; // p gets back ownership 
} // copy_of_p is destroyed, but doesn't delete pointer owned by p 

// p is still valid 

使用unique_ptrまたはその代わりshared_ptr

std::auto_ptr<int> p(new int(42)); 

{ 
    std::auto_ptr<int> copy_of_p(p); // ownership of *p is transfered here 
} // copy_of_p is destroyed, and deletes its owned pointer 

// p is now a dangling pointer 

問題を回避するには、「管理対象のポインタを管理」する必要がありました:ポインタの所有権がコピー時に転送されているので危険です。

0

get()をスマートポインタに使用しないでください(auto_、unique_、shared_などに関係なく)。これは、RAIIクラスの制御下にない裸のポインタを返します。これにより、別のRAIIクラスへのポインター(後で二重削除を引き起こす)やポインタを削除するような愚かなことをする呼び出し元(二重削除を引き起こす)へのさまざまな可能性が開かれます。スマートポインタを逆参照してください。

PS:専門家向け:はい、スマートポインタからローポインタを抽出する他の正当な理由があります。しかし、一般的にget()を使用しないことで、使用されている時間は "ここでファンキーな何かが起こっているので注意してください"という赤い旗になります。

関連する問題