2017-02-15 25 views
1

std::unique_ptrのデータがnullptrでstd :: queue :: pop()が実行されるとどうなるのだろうか。 funcqueueデータでの作業中に、以下のようにstd :: queue :: pop()操作がstd :: unique_ptrデータの上にある

#include <iostream> 
#include <queue> 
#include <memory> 
using namespace std; 

class sample 
{ 
    public: 
    int data; 
    sample() {cout << "\n Constructor Called" << endl;} 
    ~sample() {cout << "\n Destructor Called" << endl;} 
}; 

void func(queue<pair<string, unique_ptr<sample>>> & q) 
{ 
    pair<string, unique_ptr<sample>> p = std::move(q.front()); 

    try 
    { 
     q.pop(); 
    } 
    catch(...) 
    { 
     cout << "\n Exception occured" << endl; 
    } 
} 

int main() 
{ 
    queue<pair<string, unique_ptr<sample>>> q; 
    q.push((make_pair("sample obj", unique_ptr<sample>(new sample)))); 
    func(q); 
    return 0; 
} 

をコードスニペットを考えてみてください、私はコピーコンストラクタと代入演算子オーバーロード機能としてstd::moveを使用するにはstd::unique_ptrに削除されます。これによりqueueのコンテンツはpair<string, unique_ptr<sample>> pに移動します(私が間違っていれば私を修正してください)。unique_ptrはnullptrになります。q.popを実行するとどうなりますか?理想的にはstd::queue::popは、q.pop()を使用して取得された最も古い要素のデストラクタを呼び出し、deletenullptr?に実行することができます。

+3

私はあなたの懸念を完全には受けていないと思いますか? 'delete nullptr;'は完全に有効な操作です。 –

+0

すでに述べたように、 'delete nullptr'はノーオペレーションです。さらに、 '〜unique_ptr'は' nullptr'に対して 'deleter'関数を呼び出さないので、' deleter'関数が 'nullptr'に対してチェックしなくても、このコードは完全に正常です。 –

答えて

3

これは問題ありません。

pair<string, unique_ptr<sample>> p = std::move(q.front());の後に、queueの要素が移動されますが、ステータスは不確定ですが有効です。破壊可能なものも含めて

次にq.pop();は、queueから要素を削除し、要素を破棄します。上で説明したように、要素は問題なく破棄されます。

deletenullptrで実行できますか?

移動後、オブジェクトのステータスが有効なまま残っているため、気にする必要はありません。しかし、あなたの質問への直接的な答えははいです。それは問題ありません。標準ライブラリの割り当て解除関数は何もしません。

+0

unique_ptrはすべての動き我々がこの質問で見ているものに類似しています。そして、移動元のオブジェクトは破壊可能な状態にあるはずです。 –

関連する問題