如何在没有包装器或附加内存的情况下检查指针是否有效?有效是指我没有删除它,或者我可以到达它或它已分配。
我正在使用 VS\Windows。
如何在没有包装器或附加内存的情况下检查指针是否有效?有效是指我没有删除它,或者我可以到达它或它已分配。
我正在使用 VS\Windows。
如果“您没有删除该内存或分配了该内存,或者您可以访问该内存”,则该指针是有效的。所以我建议:
跟踪您分配的内存。如果此指针不在任何这些块中,则说明您没有分配它。
当您删除指针或释放内存时,将其从列表中删除。这样,您还可以检查您是否没有删除它。
尝试访问它。如果您无法访问它,则它无效。
如果它通过了这些测试,它就是有效的。
我不是在开玩笑。正确的方法是精确定义“有效”的含义并精确测试指针是否满足这些条件。
但实际上,这不是 C++ 的完成方式。无论您的根本问题是什么,都可能有更好的方法来解决。
此有效检查仅在 Windows (VS) 中检查,功能如下:
#pragma once
//ptrvalid.h
__inline bool isValid(void* ptr) {
if (((uint)ptr)&7==7)
return false;
char _prefix;
__try {
_prefix=*(((char*)ptr)-1);
} __except (true) {
return false;
}
switch (_prefix) {
case 0: //Running release mode with debugger
case -128: //Running release mode without debugger
case -2: //Running debug mode with debugger
case -35: //Running debug mode without debugger
return false;
break;
}
return true;
}
用法:
#include <stdio.h>
#include "ptrvalid.h"
void PrintValid(void* ptr) {
if (isValid(ptr))
printf("%d is valid.\n",ptr);
else
printf("%d is not valid.\n",ptr);
}
int main() {
int* my_array=(int*)malloc(4);
PrintValid(my_array);
PrintValid((void*)99);
free(my_array);
PrintValid(my_array);
my_array=new int[4];
PrintValid(my_array);
delete my_array;
PrintValid(my_array);
getchar();
}
输出:
764776 is valid.
99 is not valid.
764776 is not valid.
774648 is valid.
774648 is not valid.
函数说明:(它的作用)
函数在真正检查之前检查,如果地址有效\起点指向内存。之后,他检查这个进程是否可以到达这个内存的前缀(如果不能捕获异常),最后一个检查是检查这个内存的前缀是否在任何模式下被删除。(Debugging\Without Debug Mode\Release Mode) 如果函数通过了所有这些检查,则返回 true。