Сравнение указателей, сбой моей программы - PullRequest
1 голос
/ 08 декабря 2010

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

if((DWORD)pPrev < (DWORD)pBlock && pPrev->pList == &gFreeList)

Я приведу в DWORD, чтобы сравнить адреса указателей ... Вв этом блоке if предыдущий узел будет накапливать текущий узел, но только если его физический адрес ниже текущего блока и он уже свободен ... Код блока не является проблемой.Он даже не войдет в блок.Он падает во время сравнения указателей.

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

Если это поможет, я использую VC6 для разработки прототипа (просто потому, что IDE менее ресурсоемким) ...

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 декабря 2010

Не может ли pPrev не быть инициализирован?

Если это так, предварительное условие, (DWORD)pPrev < (DWORD)pBlock, не может быть выполнено в режиме отладки, потому что унитализированное pPrev установлено на 0xCCCCCCCC (или CD?), это, безусловно, будет больше, чем любой указатель, приведенный к DWORD (2, максимум 3 ГБ в 32-битном режиме -> максимальный адрес пользовательского пространства 0xBFFFFFFF).

Однако в режиме выпуска он будет содержать любой мусор,поэтому он может быть разыменован в (DWORD)pPrev < (DWORD)pBlock и завершит работу программы.

0 голосов
/ 08 декабря 2010

Сравнение не должно вызывать проблем здесь.На самом деле, я думаю, что сравнение будет работать даже без приведения к DWORD.Я подозреваю, что проблема заключается в pPrev-> pList.Вы уверены, что pPrev не был освобожден случайно до разыменования?

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