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

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

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

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

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

最佳答案

这很好。

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

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

can perform delete on nullptr ?

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

关于c++ - std::queue::pop() 对其 std::unique_ptr 数据的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42243796/

相关文章:

c++ - C++ 中模板化异常类的多重继承

c++ - 如何构造大小为 1000*1000 的特征矩阵

c++ - DirectX 11 调试层捕获错误字符串

c++ - 从 vector 私有(private)继承,公开相等运算符

c++ - 在 C++11 中缺少 std::u8string

c++ - 如何使用 move 语义链接函数?

C++11/VS2010 : Returning containers of uncopyable but movable objects

c++ - 如何声明一个引用变量在条件 block 之间持续存在?

c++ - 在 move 之前获取右值引用的地址是否安全?

c++ - 从函数返回进入无限循环Visual Studio 2012