Как безопасно использовать unique_ptr с функциями, которые могут возвращать NULL? - PullRequest
1 голос
/ 10 июня 2019

Я заметил, что это компилируется:

#include<memory>
#include<iostream>
using namespace std;
int main()
{
    unique_ptr<int>a(nullptr);
    if(!a)
    cout<<"NULLPTR";
}

Однако это не так:

#include<memory>
#include<iostream>
using namespace std;
int main()
{
    unique_ptr<int>a(NULL);
    if(!a)
    cout<<"NULL";
}

Я работаю с библиотекой, в которой есть несколько функций, которые возвращают необработанный указатель и которые должны быть освобождены вручную после их использования. Я хочу использовать unique_ptr (с пользовательским удалением) для управления такими необработанными указателями. Я беспокоился о тех случаях, когда эти функции возвращают NULL, так как я думаю, что это может вызвать некоторые проблемы.

Ответы [ 2 ]

5 голосов
/ 10 июня 2019

Отлично. Это просто макрос NULL (который в большинстве компиляторов расширяется до 0) и вызывает проблему. 0 соответствует конструкторам nullptr_t и T* unique_ptr, поэтому он неоднозначен и не компилируется.

При инициализации unique_ptr переменной-указателем или возвращаемым значением функции не имеет значения, использовались ли nullptr, NULL или 0. Все они имеют одинаковый эффект: нулевой указатель:

Это прекрасно, например,

int* int_p1 = NULL;
int* int_p2 = (int*)malloc(sizeof(int));

unique_ptr<int, decltype(&free)> a1(int_p1, free);
unique_ptr<int, decltype(&free)> a2(int_p2, free);

Примечание: если вы не взаимодействуете с функциями C, которые использовали для выделения malloc(), но с функциями C ++, которые использовали new, не используйте пользовательские средства удаления. Средство удаления по умолчанию unique_ptr уже использует delete.

3 голосов
/ 10 июня 2019

NULL является устаревшей константой нулевого указателя , которая не рекомендуется в пользу nullptr.Обе константы обозначают одно и то же: нулевой указатель значение .Эти константы являются конструкциями времени компиляции.

NULL устарело, потому что помимо обозначения нулевого значения указателя, оно также обозначает целое число ноль, в зависимости от контекста.(Это макрос, определенный как 0).Это опасно и подвержено ошибкам, поэтому unique_ptr специально запрещает его.

Во время выполнения функция не может вернуть константу нулевого указателя, которая относится к совершенно неправильной категории вещей.Возвращает нулевое значение указателя.В то время нет ни NULL, ни nullptr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...