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

时间:2012-08-03 14:10:21

标签: c++ pointers

  

可能重复:
  C++ - Check if pointer is pointing to valid memory (Can't use NULL checks here)

如果没有附加包装器或额外的内存,如何检查指针是否有效? 有效,我的意思是我没有删除它,或者我可以达到或分配。

我正在使用VS \ Windows。

2 个答案:

答案 0 :(得分:1)

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

  1. 跟踪您已分配的内存。如果此指针不在任何这些块中,则表示您没有分配它。

  2. 删除指针或空闲内存时,请将其从列表中删除。这样,您还可以检查是否删除了它。

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

  4. 如果通过这些测试,则无效。

  5. 我不是在开玩笑。正确的方法是通过“有效”精确定义你的意思,并精确测试指针是否符合这些条件。

    但实际上,这并不是C ++的完成方式。无论您遇到什么问题,都可能有更好的方法。

答案 1 :(得分:-3)

这个有效检查仅在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。