Как проверить LPVOID для <Bad Ptr> - PullRequest
3 голосов
/ 25 марта 2009

Я работаю с C ++ неуправляемо, у меня возникает проблема, когда я вызываю метод, который возвращает LPVOID.

LPVOID MyMethod(...);

Проблема в том, что этот метод иногда возвращает Bad Ptr, и я хочу знать, есть ли способ обнаружить это, если возвращаемое значение является Bad Ptr.

Я пытался спросить, если это NULL, не повезло.

Единственный способ, которым я понимаю, что в случае плохого Ptr - это когда я отлаживаю, я пробовал несколько разных способов, но все еще не могу это сделать.

Ответы [ 4 ]

10 голосов
/ 25 марта 2009

Нет, нет простого способа определить, является ли указатель плохим.

Windows имеет IsBadReadPtr, IsBadWritePtr. Эти функции изначально имеют недостатки - они только определяют, является ли функция доступной для чтения или записи в вашем адресном пространстве в момент вызова. Они также могут быть причиной проблем и никогда не должны использоваться.

Основная проблема заключается в том, что невозможно провести различие между «плохим» указателем, который все еще доступен для вашего процесса, и хорошим указателем.

Например,

int g[5];
int somethingElse;

void* GetPointer()
{
   return &g[5]; // Whoops, off by one.
}

& g [5], вероятно, является допустимым указателем в вашем процессе и может указывать на что-то, иначе вы сможете получить к нему доступ без сбоев, но запись в него повредит ваше состояние.

8 голосов
/ 25 марта 2009

Ваша настоящая проблема в том, что вы вызываете функцию, которая возвращает неверные указатели. У вас есть доступ к его исходному коду? В 90% случаев я сталкивался с подобными проблемами, потому что либо:

1) Функция возвращает указатель на стек; например.,

char a[10];
...
return a;

2) Функция возвращает указатель, которому никогда не назначали допустимую память для начала:

char* foo; // Invalid pointer
 ...
return foo;

3) Функция возвращает указатель, который был уже удален (или свободен):

char* foo = new char[10];
...
delete[] foo;
return foo;

Вам действительно нужно найти реальную проблему, а не обходить ее.

1 голос
/ 25 марта 2009

LPVOID - это typedef указатель на void, Visual Studio обычно отображает значения NULL как «неверный указатель» на панели просмотра. Вы уверены, что этот указатель не является NULL?

0 голосов
/ 11 ноября 2018

Нет, вы не можете.

Однако, если вы можете создать вспомогательную структуру данных для хранения местоположений и убедиться, что вы удаляете их из этой вспомогательной структуры данных, когда они удаляются (возможно, добавьте ее в деструктор), вы можете проверить, находятся ли указатели в этой структуре, прежде чем -ссылка на них.

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