如何将LPVOID验证为<;不良Ptr>; 我正在使用C++非托管,这是我调用返回LpValue/< P>的方法时发生的问题。 LPVOID MyMethod(...);

如何将LPVOID验证为<;不良Ptr>; 我正在使用C++非托管,这是我调用返回LpValue/< P>的方法时发生的问题。 LPVOID MyMethod(...);,c++,C++,问题是这个方法有时会返回一个坏的Ptr,我想知道是否有办法检测这个,如果返回的值是一个坏的Ptr 我试着问它是否为空,但没有运气 我知道结果是否是错误的Ptr的唯一方法是在调试时,我尝试了一些不同的方法,但仍然无法做到。不,没有简单的方法确定指针是否错误 Windows确实有IsBadReadPtr和IsBadWritePtr。这些函数本身是有缺陷的——它们只会在调用时确定某个函数在地址空间中是否可读写。它们也可能是导致死亡的原因,并且永远不应使用 主要问题是,无法区分进程仍然可以访问的“坏”指

问题是这个方法有时会返回一个坏的Ptr,我想知道是否有办法检测这个,如果返回的值是一个坏的Ptr

我试着问它是否为空,但没有运气


我知道结果是否是错误的Ptr的唯一方法是在调试时,我尝试了一些不同的方法,但仍然无法做到。

不,没有简单的方法确定指针是否错误

Windows确实有IsBadReadPtr和IsBadWritePtr。这些函数本身是有缺陷的——它们只会在调用时确定某个函数在地址空间中是否可读写。它们也可能是导致死亡的原因,并且永远不应使用

主要问题是,无法区分进程仍然可以访问的“坏”指针和好指针

比如说,

int g[5];
int somethingElse;

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

&g[5]可能是进程中的一个有效指针,并且可能指向某个东西。此外,您可以在不崩溃的情况下访问它,但写入它会破坏您的状态。

您真正的问题是调用的函数返回错误的指针。你有权访问它的源代码吗?90%的时间我都会遇到这样的问题,这是因为:

1) 函数返回指向堆栈的指针;e、 g

char a[10];
...
return a;
2) 函数返回一个从未分配有效内存的指针:

char* foo; // Invalid pointer
 ...
return foo;
3) 函数返回的指针已被删除(或释放):


您确实需要找到真正的问题,而不是解决它。

LPVOID
是指向
void
指针的
typedef
,Visual studio通常在监视窗格中将
NULL
值显示为“坏指针”,您确定该指针不是
NULL

不,您不能


但是,如果您可以创建一个辅助数据结构来存储位置,并确保在删除位置时将其从该辅助数据结构中删除(可能将其添加到析构函数),则可以在取消引用指针之前检查指针是否在该结构中。

不要返回“坏指针”,返回NULL,因为您可以正常地检查它。另请参阅Raymond Chen的NULL在我的机器上显示为NULL,并且在某些内容确实已失效且保留的地址不可能有效时显示。
char* foo = new char[10];
...
delete[] foo;
return foo;