2017-02-15 4 views
1

Мне просто интересно, что произойдет, если 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?.

+3

Я думаю, что я не полностью понимаю вашу озабоченность? 'delete nullptr;' - вполне допустимая операция. –

+0

как уже упоминалось, 'delete nullptr' - нет-op. Кроме того, '~ unique_ptr' не вызывает функцию' deleter' для 'nullptr', поэтому этот код полностью прекрасен, даже если функция' deleter' не проверяет 'nullptr' –

ответ

3

Это прекрасно.

После pair<string, unique_ptr<sample>> p = std::move(q.front()); элемент queue перемещается, его статус неопределен, но все еще действителен; включая разрушаемость.

Тогда q.pop(); удалит элемент из queue и уничтожит элемент. Как объяснено выше, элемент будет уничтожен без проблем.

может выполнять delete по телефону nullptr?

После перемещения статус объекта остается в силе, значит, вам не нужно беспокоиться об этом. Но прямой ответ на ваш вопрос - да, это нормально; стандартные функции освобождения библиотеки ничего не делают для этого.

+0

Стоит отметить, что unique_ptr работает во всех перемещениях контейнеров, аналогичных тому, что мы видим в этом вопросе. И перемещенный объект должен находиться в разрушаемом состоянии. –

Смежные вопросы