std::queue::pop() 对其 std::unique_ptr 数据的操作

std::queue::pop() operation on its std::unique_ptr data

我只是想知道如果对 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;
}

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

上执行 delete

这很好。

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

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

can perform delete on nullptr ?

移动后对象的状态仍然有效意味着您无需担心。但是对你的问题的直截了当的回答是肯定的,没关系;标准库释放函数对此无能为力。