У меня есть элемент данных в классе, который является указателем. Кроме того, у меня есть функция установки для динамического выделения этого указателя, скажем, для целей динамического массива. Перед установкой новых значений мне нужно удалить этот указатель, чтобы избежать утечки памяти. Интересно, как мне проверить, инициализирован ли этот указатель, чтобы, если он не инициализирован, мне не нужно было удалять память указателя перед установкой новых значений.
Как проверить, был ли инициализирован указатель как член данных в классе на С++?
Ответы (1)
У вас есть два варианта. Во-первых, вы можете сделать все вручную и установить его в nullptr
в конструкторе. Затем перед выделением новой памяти вы можете проверить, является ли она nullptr
, и удалить ее, если это не так. Вместо этого я бы рекомендовал использовать интеллектуальный указатель, например std::unique_ptr
. Вы можете вызывать reset
каждый раз, когда вам нужно установить новый указатель, и никогда не беспокоиться об утечках памяти. Он обязательно удалит ранее выделенную память, если таковая имеется.
person
grigor
schedule
24.10.2016
В вашем первом сценарии вам не нужно проверять NULL перед его удалением.
delete
правильно обрабатывает нулевые указатели.
- person Pete Becker; 24.10.2016
@PeteBecker 1. Вы имеете в виду, что мне все еще нужно установить его на
nullptr
, но не нужно проверять его недействительность до delete
? 2. В будущем мой указатель может быть динамическим массивом, тогда delete [] a_pointer;
также правильно работает с nullptr
?
- person Nicholas; 24.10.2016
@grigor
std::unique_ptr
звучит великолепно, но просто интересно, есть ли какие-либо затраты на производительность (имеется в виду замедление скорости) для использования этой магии std::unique_ptr
?
- person Nicholas; 24.10.2016
Короткий ответ не очень. Более длинный ответ здесь: заголовок stackoverflow.com/questions/22295665/
- person grigor; 24.10.2016
@PeteBecker Я знаю, что если указатель в классе не инициализирован
nullptr
, он получает ненужное значение. Тогда хорошо ли delete
справляется с этим нежелательным значением? Читая ваш комментарий, я думаю, что мне действительно нужно инициализировать указатель.
- person Nicholas; 24.10.2016
nullptr
, когда он не используется, или сделайте разумную вещь и просто используйтеunique_ptr
для обработки времени жизни для вас. Между прочим, вызовdelete
наnullptr
все равно ничего не дает. - person jaggedSpire   schedule 24.10.2016nullptr
? Интересно, как это делается на C++? @jaggedSpire - person Nicholas   schedule 24.10.2016nullptr
с инициализацией члена класса, в списке инициализаторов членов или в теле конструктора - person jaggedSpire   schedule 24.10.2016unique_ptr
, обязательно используйте вариантT[]
, объявленный какstd::unique_ptr<T[]>
, гдеT
— это тип, для которого вы динамически выделяете массивы. Он вызываетdelete[]
по своему внутреннему указателю, как и положено с массивами. - person jaggedSpire   schedule 24.10.2016std::unique_ptr
звучит великолепно, но просто интересно, есть ли какие-либо затраты на производительность (имеется в виду замедление скорости) для использования этой магииstd::unique_ptr
? - person Nicholas   schedule 24.10.2016