Мне просто интересно, что произойдет, если std :: queue :: pop() выполняется на своих std::unique_ptr
данных, которые являются nullptr
. Пожалуйста, обратите внимание на фрагмент кода, как показано ниже,std :: queue :: pop() операция по его данным std :: unique_ptr
#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
. Это эффективно перемещает содержимое queue
в pair<string, unique_ptr<sample>> p
(пожалуйста, поправьте меня, если я ошибаюсь здесь) и unique_ptr
станет nullptr, и что произойдет, если я выберу q.pop
. В идеале std::queue::pop
вызовет деструктор самого старого элемента, который извлекается с помощью q.pop()
, может выполнять delete
по адресу nullptr
?.
Я думаю, что я не полностью понимаю вашу озабоченность? 'delete nullptr;' - вполне допустимая операция. –
как уже упоминалось, 'delete nullptr' - нет-op. Кроме того, '~ unique_ptr' не вызывает функцию' deleter' для 'nullptr', поэтому этот код полностью прекрасен, даже если функция' deleter' не проверяет 'nullptr' –