Неожиданная инициализация элемента POD по умолчанию с нулевым значением [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неожиданная инициализация элемента POD по умолчанию с нулевым значением [дубликат]

Сообщение Anonymous »

Я столкнулся с ситуацией, которую не совсем понимаю:

У меня есть класс с собственным конструктором и несколькими переменными-членами, в котором конструктору не удалось инициализировать одну переменную-член 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»