我只是想知道如果在其 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;
}
在使用 queue
时func
中的数据, 我用 std::move
因为在 std::unique_ptr
中删除了复制构造函数和赋值运算符重载函数.这有效地 move 了 queue
内容为pair<string, unique_ptr<sample>> p
(如果我在这里错了,请纠正我)和unique_ptr
变成 nullptr,如果我执行 q.pop
会发生什么.理想情况下 std::queue::pop
将调用使用 q.pop()
检索到的最旧元素的析构函数, 可以执行 delete
在 nullptr
?
最佳答案
这很好。
在 pair<string, unique_ptr<sample>> p = std::move(q.front());
之后, queue
的元素被 move ,其状态不确定但仍然有效;包括可破坏性。
然后 q.pop();
将从 queue
中删除元素, 并销毁该元素。如上所述,元素将被毫无问题地销毁。
can perform
delete
onnullptr
?
move 后对象的状态仍然有效意味着你不需要担心它。但是对你的问题的直截了当的回答是肯定的,没关系;标准库释放函数对此无能为力。
关于c++ - std::queue::pop() 对其 std::unique_ptr 数据的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42243796/