C++: членский указатель инициализируется?

В файле Вашего виджета Info.plist не забывайте устанавливать Ваш AllowNetworkAccess ключ к истинному.

10
задан Daniel 17 July 2009 в 16:11
поделиться

7 ответов

Вот соответствующий отрывок из стандарта:

12.6.2 Инициализация баз и членов [class.base.init]

4 Если данный нестатический член данных или базовый класс не назван mem-
идентификатор инициализатора в mem-initializer-list, затем

- Если объект представляет собой нестатические данные член (возможно, квалифицированный по резюме) тип класса (или его массив) или базовый класс и класс сущности не является классом POD, объект инициализируется по умолчанию ( dcl.init ). Если сущность является нестатическим членом данных типа с квалификацией const, класс сущности должен иметь объявленный пользователем конструктор по умолчанию.

- В противном случае сущность не является инициализирован . Если сущность константный тип или ссылочный тип, или (возможно, cv-quali- fied) тип класса POD (или его массив), содержащий (непосредственно или косвенно) член константного типа, программа больной- сформирован.

После вызова конструктора для класс X завершен, если член

X не указан в инициализаторы памяти конструктора, ни
инициализированный по умолчанию, не инициализированный при исполнении корпуса
конструктор, член имеет неопределенное значение.

11
ответ дан 3 December 2019 в 22:01
поделиться

Согласно C ++ 0x standard раздел 12.6.2.4, в случае вашей переменной-указателя, если вы не включаете ее в список инициализаторов и вы не устанавливайте его в теле конструктора, тогда он имеет неопределенное значение. 0xCDCDCDCD и 0 - два возможных таких значения, как и все остальное. : -)

4
ответ дан 3 December 2019 в 22:01
поделиться

Значение pB не определено. Это может быть одно и то же значение, а может и не быть - обычно это зависит от того, что раньше находилось в одном и том же месте в памяти до выделения конкретного экземпляра A.

0
ответ дан 3 December 2019 в 22:01
поделиться

Я считаю, что это артефакт из старых добрых времен C, когда у вас не могло быть никаких ожиданий относительно того, что содержит выделенная память. По мере того как стандарты переходили на C ++, это «соглашение» сохранялось. По мере развития компиляторов C ++ отдельные авторы взяли на себя задачу «исправить» эту проблему. Следовательно, ваш опыт может варьироваться в зависимости от выбранного вами компилятора.

"0xcdcdcdcd" выглядит легко узнаваемым шаблоном, который "помогает" в отладке вашего кода. Вот почему он не отображается в режиме выпуска.

Надеюсь, это немного помогло и удачи.

1
ответ дан 3 December 2019 в 22:01
поделиться

Неинициализированные указатели могут указывать на что угодно. Некоторые поставщики компиляторов помогут вам и заставят их указывать на 0 или 0xcdcdcdcd или что-то еще.

Чтобы убедиться, что ваш код безопасен и переносится, вы всегда должны инициализировать свои указатели. либо на 0, либо на допустимое значение.

например

C* pc = 0;

или

C* pc = new C(...);

Если вы всегда инициализируете указатели на 0, тогда это безопасно:

if (!pc) 
    pc = new C(...);

Если вы не инициализируете, то у вас нет способа узнать отдельно инициализированные и неинициализированные указатели.

Кстати, в C ++ нет такого ключевого слова, как NULL. Большинство компиляторов определяют NULL как 0, но использование его не считается переносимым. Новый стандарт c ++ 0x представит новое ключевое слово nullptr, поэтому, когда оно появится, мы

0
ответ дан 3 December 2019 в 22:01
поделиться

Я редко рекомендую не изучать что-то об используемом вами языке, но в этом случае вопрос о том, инициализирован ли pB или нет, не является полезной информацией. Просто инициализируйте его. Если он инициализируется автоматически, компилятор оптимизирует дополнительную инициализацию. Если это не так, вы добавили одну дополнительную инструкцию процессора и предотвратили множество потенциальных ошибок.

0
ответ дан 3 December 2019 в 22:01
поделиться

Неинициализированные указатели могут в основном содержать случайное значение, хотя некоторые компиляторы имеют тенденцию заполнять им присваивается 0 или какое-то другое узнаваемое значение, особенно в режиме отладки.

ИМХО, это связано с дизайном C ++ «не платите за то, что вы не используете». Если вы не считаете это важным, компилятору не нужно тратить деньги на инициализацию переменной за вас. Конечно, после того, как вы поймали случайный указатель, вы можете счесть целесообразным инициализировать его в следующий раз ...

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

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

0
ответ дан 3 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: