我只是想知道,如果在其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函数对此无能为力。