2014-01-16 4 views
0

В QT я следую примеру написания интерфейса в файле заголовка, а затем реализации в файлах .cpp. В моем случае у меня есть один MainApplication и два диалогов детей MainApplicationНеинициализированные указатели в QT

так в MainApplication заголовке, два не-инициализируются указатели на два диалоги

MemberForm *memberForm; 
AboutForm *aboutUsForm; 

Насколько я знаю, что указатель будет быть Null и это следующие условия принимает значение истинного

memberForm == NULL //False 
aboutUsForm == NULL //False 

насколько я знаю, что все не инициализируются указатели NULL указатели, так что это странно для меня. что делает его более странно, что удаление одного из указателей в заголовке, условия оценивает истинную

MemberForm *memberForm; 
//AboutForm *aboutUsForm; // Removing the pointer 

условие оценивается верно

memberForm == NULL //True 

Я ценю любой ответ. PS: Если вы собираетесь понизить рейтинг, пожалуйста, оставьте комментарий, объясняющий почему ..

+1

Ваш второй тест - это просто «удача», эти члены не будут инициализированы, вам нужно сделать это самостоятельно. – Mat

+2

В C++ указатели не инициализируются в NULL/nullptr без явного назначения. Значение по умолчанию не определено и в большинстве случаев укажет на неинициализированную память. В некоторых настройках, таких как отладочные сборки с MSVC, компилятор * может * решить, чтобы инициализировать значения с нулевым значением, но на этом вы не можете положиться вообще - он уже сломается в сборках релизов. –

+0

@ Мать да, я счастливый мальчик: D и он выглядит, что мне нужно учиться больше .. –

ответ

0

Необработанные («голые») элементы указателя на объекты, выделенные кучей, не инициализируются ни на C, ни на C++. Их значение не определено и не может зависеть до первой инициализации. Какую бы ценность вы ни приобрели, вы получили это по совпадению, а не по дизайну.

Как правило, необработанные указатели на объекты, выделенные на куче на C++, являются надежным способом съемки себя в ногу и часто являются признаком плохого дизайна. На самом деле нет смысла перетаскивать небезопасные аспекты C на C++. У вас есть сила C++, используйте ее, чтобы помочь себе.

Умный указатель, например QScopedPointer, имеет более здравое поведение, и вы должны использовать его вместо этого.

  1. Вы можете проверить, был ли он инициализирован.

  2. Вам не нужно беспокоиться о том, чтобы удалить указанное значение. Он будет удален автоматически, когда интеллектуальный указатель будет уничтожен - в то время, когда код деструктора, созданный компилятором, запускается для этого класса, который несет интеллектуальный указатель.

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