如何在没有带布尔的包装的情况下检查指针是否有效
How to check if pointer is valid without wrapper with bool
可能重复:
C++-检查指针是否指向有效内存(此处不能使用NULL检查)
如何在没有包装器或附加内存的情况下检查指针是否有效?我所说的有效是指我没有删除它,或者我可以访问它或它已分配。
我正在使用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.
函数的解释:(它的作用)
如果地址是有效的\指向内存的起点,则函数在实际检查之前进行检查。之后,他检查这个进程是否可以达到这个内存的前缀(如果不能,则捕获异常),最后一次检查是检查在任何模式下删除该内存的前缀。(调试\无调试模式\发布模式)如果函数通过了所有这些检查,则返回true。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 如何在不公开 C API 的情况下包装 C API
- 在没有包装程序类的情况下,在ActiveX接口上调用方法
- 在没有包装器的情况下提高指向基元的指针的序列化
- 如何在没有带布尔的包装的情况下检查指针是否有效
- 在不引入包装的情况下打印一对