如何在没有带布尔的包装的情况下检查指针是否有效

How to check if pointer is valid without wrapper with bool

本文关键字:情况下 包装 检查 指针 有效 是否 布尔      更新时间:2023-10-16

可能重复:
C++-检查指针是否指向有效内存(此处不能使用NULL检查)

如何在没有包装器或附加内存的情况下检查指针是否有效?我所说的有效是指我没有删除它,或者我可以访问它或它已分配。

我正在使用VS\Windows。

如果"您没有删除该指针,或者该内存已分配,或者您可以访问该内存",则指针是有效的。所以我建议:

  1. 记录您分配的内存。如果这个指针不在这些块中的任何一个块中,则表示您没有分配它。

  2. 删除指针或释放内存时,请将其从列表中删除。这样,你也可以检查你没有删除它

  3. 尝试访问它。如果您无法访问它,则它无效。

  4. 如果它通过了这些测试,它就是有效的。

我不是在开玩笑。正确的方法是精确定义"有效"的含义,并精确测试指针是否满足这些条件。

但实际上,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。