Скорее всего, вы читаете из неинициализированной памяти.Для облегчения отладки такого рода проблем в сборках debug библиотека времени выполнения (и в зависимости от цепочки инструментов компилятора также компилятор) вставляет код, который заполняет все выделения памяти шаблонами канарейки .Эти шаблоны могут отображаться как за пределами чтения, так и в неинициализированной памяти.Точно так же код проверки работоспособности проверяет шаблоны целостности для проверки за пределами записей.
Поскольку в распространенных в настоящее время компьютерных архитектурах защита памяти работает только с определенной степенью детализации, а именно размер страницы ,который в большинстве случаев составляет 4096 байт¹, для обнаружения повреждения памяти используются эти канареечные значения.
В любом случае, причина, по которой вы видите разные значения в debug и release builds - это то, что память фактически инициализируется по-разному для каждого случая, и это проявляется Для вас важно то, что из-за разницы ваш код делает что-то не так, т.е. у вас есть ошибка, которую нужно исправить!
Если вы создавали это для Linux, моя рекомендациябудет запускать вашу программу через отладчик памяти Valgrind .Valgrind - это инструмент, специально разработанный для устранения ошибок такого рода.Он примерно работает, пропуская ваш код через эмулируемый процессор, отслеживая каждое выделение памяти и доступ к ней, сообщая вам строку исходного кода, где происходят недопустимые доступы.
На Valgrind заменены SO Q & A вместоРазработка для Windows: Есть ли хороший заменитель Valgrind для Windows?
1: огромные страницы (обычно 2 МБ) и гигабайты (обычно 1 ГБ) также часто доступны, но если только вызапросите их явно, это просто стандартный размер страницы.