首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::queue::pop()对其std::unique_ptr数据的操作

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

Stack Overflow用户
提问于 2017-02-15 08:08:01
回答 1查看 1.3K关注 0票数 1

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-15 08:15:15

这很好。

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

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

可以在delete上执行nullptr吗?

在移动之后,对象的状态仍然有效,这意味着您不需要担心它。但是,对您的问题的直接回答是肯定的,这很好;标准的库去分配函数对此没有任何作用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42243796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档