Что может быть причиной этой ошибки доступа к памяти (C ++)?Может ли быть неопределенное поведение? - PullRequest
0 голосов
/ 20 июля 2011

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

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

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

Сама ошибка:
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 Ответ

5 голосов
/ 20 июля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...