В нескольких моих старых проектах кода, когда я никогда не слышал о умных указателях, всякий раз, когда мне нужно было проверить, все ли указатель указывает на действительный объект, я всегда буду делать что-то вроде этого...
object * meh = new object;
if(meh)
meh->member;
Или, когда мне нужно было безопасно удалить объект, что-то вроде этого
if(meh)
{
delete meh;
meh = 0;
}
Хорошо, теперь я узнал о проблемах, которые могут возникнуть в результате использования объектов и указателей в булевых выражениях как с буквальными числами, так и с жестким путем:. И теперь я также узнал о не столь новой, но довольно крутой функции С++, ключевого слова nullptr
. Но теперь мне интересно.
Я уже прошел и пересмотрел большую часть моего кода, чтобы, например, при удалении объектов я теперь пишу
if(meh)
{
delete meh;
meh = nullptr;
}
Теперь мне интересно о логическом. Когда вы проходите, просто скажите int в оператор if, как это,
int meh;
if(meh)
Затем он неявно проверяет нуль, не требуя его записи.
if(meh == 0) // does the exact same check
Теперь, С++ сделает то же самое для указателей? Если передать в char *, как это, в оператор if?
char * meh;
if(meh)
Тогда это будет неявно сравнивать его с nullptr? Из-за того, как долго я писал эти, если это так, на данный момент является второй натурой, чтобы проверить, действительны ли указатели перед использованием, набрав if (object *), а затем вызвав его члены. Если это не функциональность, почему бы и нет? Слишком сложно реализовать? Решите некоторые проблемы, удалив еще один крошечный способ, которым вы могли бы испортить свой код.