std :: queue :: pop()在其std :: unique_ptr数据上操作



我只是想知道,如果在其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中删除元素,并销毁元素。如上所述,该元素将在没有问题的情况下被破坏。

可以在nullptr上执行delete

移动对象状态后,保持有效的状态意味着您无需担心它。但是,您问题的直接答案是肯定的,很好。标准库Deallocation函数对此无能为力。

最新更新