Так что это всего лишь случай "неинициализированных данных, приводящих к неопределенному поведению"
Да ...
Иногда, если вы позвоните malloc
(или new
, который вызывает malloc
), вы получите данные, заполненные нулями, потому что они находятся на новой странице ядра. В других случаях он будет полон мусора. Если вы поместите что-то в стек (то есть, в автоматическое хранилище), вы почти наверняка получите мусор - но это может быть сложно отладить, потому что в вашей системе этот мусор может оказаться несколько предсказуемым. А с объектами в стеке вы обнаружите, что изменение кода в совершенно другом исходном файле может изменить значения, которые вы видите в неинициализированной структуре данных.
О POD: Является ли что-то POD или нет, это действительно красная сельдь. Я объяснил это только потому, что в вопросе упоминался POD, и разговор оттуда сошел с рельсов. Двумя важными понятиями являются продолжительность хранения и конструкторы. У объектов POD нет конструкторов, но не все без конструктора - это POD. (Технически, объекты POD не имеют нетривиальных конструкторов или членов с нетривиальными конструкторами.)
Срок хранения: Существует три вида. Статическая длительность для глобальных переменных, автоматическая для локальных переменных и динамическая для объектов в куче. (Это упрощение и не совсем правильное, но вы можете прочитать стандарт C ++ самостоятельно, если вам нужно что-то совершенно правильное.)
Все, что имеет статическую длительность хранения, инициализируется нулем. Поэтому, если вы создадите глобальный экземпляр BaseClass
, то его член pub
будет равен нулю (сначала). Поскольку вы помещаете его в стек и кучу, это правило не применяется - и вы ничего не делаете для его инициализации, поэтому он не инициализирован. Он содержит все ненужное, оставленное в памяти последним фрагментом кода для его использования.
Как правило, любой POD в куче или стеке будет неинициализирован, если вы не инициализируете его самостоятельно, и значение будет неопределенным, что может измениться при повторной компиляции или повторном запуске программы. Как правило, любой глобальный POD инициализируется нулем, если вы не инициализируете его чем-то другим.
Обнаружение неинициализированных значений: Попробуйте использовать инструмент memcheck от Valgrind, он поможет вам найти, где вы используете неинициализированные значения - обычно это ошибки.