Как проверить, был ли инициализирован указатель как член данных в классе на С++?

У меня есть элемент данных в классе, который является указателем. Кроме того, у меня есть функция установки для динамического выделения этого указателя, скажем, для целей динамического массива. Перед установкой новых значений мне нужно удалить этот указатель, чтобы избежать утечки памяти. Интересно, как мне проверить, инициализирован ли этот указатель, чтобы, если он не инициализирован, мне не нужно было удалять память указателя перед установкой новых значений.


person Nicholas    schedule 24.10.2016    source источник
comment
установите nullptr, когда он не используется, или сделайте разумную вещь и просто используйте unique_ptr для обработки времени жизни для вас. Между прочим, вызов delete на nullptr все равно ничего не дает.   -  person jaggedSpire    schedule 24.10.2016
comment
Вы имеете в виду установку значений по умолчанию для члена как nullptr? Интересно, как это делается на C++? @jaggedSpire   -  person Nicholas    schedule 24.10.2016
comment
Ага. просто установите его в nullptr с инициализацией члена класса, в списке инициализаторов членов или в теле конструктора   -  person jaggedSpire    schedule 24.10.2016
comment
Если вы используете unique_ptr, обязательно используйте вариант T[], объявленный как std::unique_ptr<T[]>, где T — это тип, для которого вы динамически выделяете массивы. Он вызывает delete[] по своему внутреннему указателю, как и положено с массивами.   -  person jaggedSpire    schedule 24.10.2016
comment
@jaggedSpire std::unique_ptr звучит великолепно, но просто интересно, есть ли какие-либо затраты на производительность (имеется в виду замедление скорости) для использования этой магии std::unique_ptr?   -  person Nicholas    schedule 24.10.2016
comment
не совсем. Unique_ptr предназначен для минимальных накладных расходов по необработанному указателю с ручным управлением памятью.   -  person jaggedSpire    schedule 24.10.2016


Ответы (1)


У вас есть два варианта. Во-первых, вы можете сделать все вручную и установить его в nullptr в конструкторе. Затем перед выделением новой памяти вы можете проверить, является ли она nullptr, и удалить ее, если это не так. Вместо этого я бы рекомендовал использовать интеллектуальный указатель, например std::unique_ptr. Вы можете вызывать reset каждый раз, когда вам нужно установить новый указатель, и никогда не беспокоиться об утечках памяти. Он обязательно удалит ранее выделенную память, если таковая имеется.

person grigor    schedule 24.10.2016
comment
В вашем первом сценарии вам не нужно проверять NULL перед его удалением. delete правильно обрабатывает нулевые указатели. - person Pete Becker; 24.10.2016
comment
@PeteBecker 1. Вы имеете в виду, что мне все еще нужно установить его на nullptr, но не нужно проверять его недействительность до delete? 2. В будущем мой указатель может быть динамическим массивом, тогда delete [] a_pointer; также правильно работает с nullptr? - person Nicholas; 24.10.2016
comment
@grigor std::unique_ptr звучит великолепно, но просто интересно, есть ли какие-либо затраты на производительность (имеется в виду замедление скорости) для использования этой магии std::unique_ptr? - person Nicholas; 24.10.2016
comment
Короткий ответ не очень. Более длинный ответ здесь: заголовок stackoverflow.com/questions/22295665/ - person grigor; 24.10.2016
comment
@PeteBecker Я знаю, что если указатель в классе не инициализирован nullptr, он получает ненужное значение. Тогда хорошо ли delete справляется с этим нежелательным значением? Читая ваш комментарий, я думаю, что мне действительно нужно инициализировать указатель. - person Nicholas; 24.10.2016