对std :: unique_ptr数据执行std :: queue :: pop()操作

时间:2017-02-15 08:08:02

标签: c++ c++11 move-semantics

我只是想知道如果对std::unique_ptr数据nullptr执行std :: queue :: pop()会发生什么。请考虑以下代码段

#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;
}

在使用queue中的func数据时,我使用std::move作为复制构造函数,并在std::unique_ptr中删除赋值运算符重载函数。这有效地将queue内容移动到pair<string, unique_ptr<sample>> p(如果我在这里错了,请纠正我)并且unique_ptr变为nullptr,如果我执行q.pop会发生什么。理想情况下,std::queue::pop将调用使用q.pop()检索的最旧元素的析构函数,可以在delete上执行nullptr

1 个答案:

答案 0 :(得分:3)

这很好。

pair<string, unique_ptr<sample>> p = std::move(q.front());之后,queue的元素被移动,其状态是不确定的但仍然有效;包括可以破坏。

然后q.pop();将从queue中删除该元素,并销毁该元素。如上所述,元素将被销毁而没有问题。

  

可以在delete上执行nullptr吗?

移动后,对象的状态仍然有效意味着您无需担心它。但对你的问题直截了当的回答是肯定的,这很好;标准库释放函数对它没有任何作用。