我只是想知道,如果std::queue::pop()对其std::unique_ptr
数据(即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;
}
在使用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
?
发布于 2017-02-15 08:15:15
这很好。
在pair<string, unique_ptr<sample>> p = std::move(q.front());
之后,queue
的元素被移动,它的状态是不确定的,但仍然有效;包括可销毁。
然后q.pop();
将从queue
中删除该元素,并销毁该元素。如前所述,元素将被毫无问题地销毁。
可以在
delete
上执行nullptr
吗?
在移动之后,对象的状态仍然有效,这意味着您不需要担心它。但是,对您的问题的直接回答是肯定的,这很好;标准的库去分配函数对此没有任何作用。
https://stackoverflow.com/questions/42243796
复制相似问题