У меня есть класс с собственным конструктором и несколькими переменными-членами, в котором конструктору не удалось инициализировать одну переменную-член POD. Таким образом, эта переменная-член инициализируется по умолчанию.
Я знаю, что при инициализации типов POD по умолчанию используется неопределенное значение, которое обычно является последним присвоенным значением из этой ячейки памяти.
Использование такого неинициализированного значения является неопределенным поведением.
Чего я не понимаю: Практически я все равно всегда получаю нулевое значение, даже в режиме отладки.
Я протестировано с различными компиляторами GCC и MSVC и наблюдает одно и то же поведение.
Есть ли какое-нибудь хорошее объяснение, почему он обычно ведет себя так, кроме «Компиляторы решили так сделать»? Может быть, что-то вроде дополнения к более позднему стандарту C++?
Если это имеет значение, мой продуктивный код предназначен для совместимости с C++14 и более поздними версиями.
В моем продуктивном коде такое поведение скрывает пропущенную инициализацию для долгое время, поскольку предполагаемое значение по умолчанию – 0.
Вот тестовый код, который близок к моему реальному сценарию:
Код: Выделить всё
#include
class Foo
{
public:
Foo() = default;
Foo(unsigned int i) {
m_index = i;
// produce some instances with a valid initialized value to increase the chance for memory reuse other than 0
if(i % 2 == 0) {
m_u = i;
}
// else no initialization of m_u
}
void print() const {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79900145/unexpected-zero-value-default-initialization-of-pod-member[/url]
Мобильная версия