Функция C ++ раньше работала, теперь возвращает 0xfdfdfdfd - PullRequest
0 голосов
/ 27 января 2012

У меня есть код, который я написал несколько лет назад.Он работал нормально, но после недавней перестройки с каким-то новым, не связанным кодом в другом месте, он больше не работает.Это код:

//myobject.h
...
inline  CMapStringToOb* GetMap(void)    {return (m_lpcMap);};
...

Выше приведен доступ из основного приложения, например, так:

//otherclass.cpp
...
CMapStringToOb* lpcMap = static_cast<CMyObject*>(m_lpcBaseClass)->GetMap();
...

Как я уже сказал, это БЫЛО работать долгое время, но он просто решилначать терпеть неудачу с нашей последней сборки.Я отладил это, и я вижу, что в коде, где установлен указатель, он правильно устанавливает адрес памяти в фактическое значение.Я даже смог войти в функцию set, записать адрес памяти, затем перейти к этой функции, дать ей получить 0xfdfdfdfd, а затем вручную получить адрес памяти в отладчике.Это заставляет код работать.Итак, из того, что я прочитал, 0xfdfdfdfd означает защиту байтов или «ничейную землю», но я не совсем понимаю, каковы последствия этого.Возможно, это также означает отключение одной ошибкой, но я не понимаю, как это могло произойти, если код работал раньше.

Ответы [ 3 ]

5 голосов
/ 27 января 2012

Я предполагаю, что из венгерской нотации вы используете Visual Studio. Так как вы знаете адрес, который содержит указатель карты, запустите вашу программу в отладчике и установите точку останова данных, когда этот указатель карты изменится (память, содержащая указатель карты, а не указанную карту). Тогда вы узнаете точно , когда он перезаписывается.

3 голосов
/ 27 января 2012

0xfdfdfdfd обычно означает, что вы получили доступ к памяти, которую вы не должны были.

  • Существует хороший шанс , память была выделена и впоследствии освобождена.Таким образом, вы используете освобожденную память.
  • static_cast может изменить указатель, и у вас есть явное приведение к CMyObject и неявное приведение к CMapStringToOb.Проверьте правильность указателя, непосредственно возвращенного из GetMap().
2 голосов
/ 27 января 2012

Сценарии, где происходит "волшебство", почти всегда возвращаются к повреждению памяти.Я подозреваю, что где-то в вашем коде вы неправильно изменили память, и это приводит к такому странному поведениюПопробуйте протестировать несколько разных способов ввода этой части кода.Является ли поведение согласованным?

Это также может быть вызвано неправильно построенным двоичным файлом.Попробуйте очистить и восстановить ваш проект.

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