Что может быть причиной этой ошибки доступа к памяти (C++)? Может ли быть неопределенное поведение?

У меня есть относительно большой класс, с которым я работаю, и до сих пор все работало нормально (примечание: на самом деле я не писал этот класс, я просто добавил некоторые функциональные возможности). Однако, после объявления еще одной строки в заголовочном файле, все теперь падает (я получаю ошибку доступа к памяти). Если я удаляю эту строку и перестраиваю, все работает нормально.

Я на самом деле не делаю НИЧЕГО с этой строкой... просто акт объявления ее вызывает странную ошибку памяти.

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

Сама ошибка:
Unhandled exception at 0x65fd17fd (msvcp80d.dll) in myFile.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.

В основном все, что изменилось в файле.h:

StringType string1;

Превратился в:

StringType string1;
StringType string2;

StringType является расширением basic_string

1 ответ

Решение

Вы выделили немного памяти в кучу и не смогли ее инициализировать.

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

Что касается того, почему изменение определения класса влияет на результат, вы, возможно, делаете неверную арифметику указателей, обращаетесь к чему-то за пределами динамически размещенного объекта или к любой другой вещи, которая больше не проявляется как ошибка, когда у вас больше объект. Вы также можете нарушать правило с одним определением, если часть источника была построена с использованием старого определения, а часть источника построена с новым определением.

Есть много вещей, которые могут вызвать такую ​​проблему: лучше всего прервать работу отладчика, когда это произойдет, и проследить в обратном направлении, чтобы увидеть, где возникла ошибка (иногда это может быть очень забавно; мне пришлось отслеживать неинициализированную переменную. через сетевое соединение один раз).

Другие вопросы по тегам