std::queue的pop操作会调用对象的析构函数
今天在写代码时用到了一个内容是指针的队列,为了降低指针的维护难度,便打算用unique_ptr来维护指针。之后便在想,queue中的unique_ptr每次pop后会立即析构吗,于是便写了下面这段测试demo:
class Person
{
int _id;
public:
Person(int id) : _id(id) { std::cout << "* init " << _id << std::endl; }
~Person() { std::cout << "- free " << _id << std::endl; }
};
int main()
{
std::queue<std::unique_ptr<Person>> people;
people.push(std::unique_ptr<Person>(new Person(1)));
people.push(std::unique_ptr<Person>(new Person(2)));
people.push(std::unique_ptr<Person>(new Person(3)));
people.push(std::unique_ptr<Person>(new Person(4)));
people.push(std::unique_ptr<Person>(new Person(5)));
people.push(std::unique_ptr<Person>(new Person(6)));
for (int i = 0; i < 3; i++)
{
people.pop();
std::cout << "people pop once..." << std::endl;
}
return 0;
}
发现每次pop之后,unique_ptr就会立即析构,后续在其它代码不变的情况下,又把unique_ptr分别换成了普通指针和普通对象,后续发现普通指针从头到死都不析构(因为没有手动析构),而换成普通对象之后就和unique_ptr一样析构了。
后续通过debug发现,queue的pop函数中调用了一个名字中含有destroy的函数:
结合之前的现象判断,这个函数就是调用待pop对象的析构函数。