c++检查指针是否有效

C++ check if pointer is valid?

本文关键字:有效 是否 指针 检查 c++      更新时间:2023-10-16

我在c++中有有效指针的问题。我在不同的线程中使用一个对象,所以我不能只是将指针设置为NULL并返回。这是我正在尝试的:

int main()
{
    char *ptr = new char[1024]; //assume PTR = 0x12345678
    changePtr(ptr);  //after calling this,
                     //ptr is not NULL here.
    return 0;
}
void changePtr(char *ptr)
{
    delete [] ptr; //ptr = 0x12345678
    ptr = NULL; //ptr = NULL
}

我如何将ptr更改为NULL两个功能?

修改changePtr的签名为:

void changePtr(char **ptr)
{
   delete [] *ptr; //ptr = 0x12345678
   *ptr = NULL; //ptr = NULL
}

并使用:

changePtr(&ptr);

在c++中,使用引用参数:

void changePtr(char *&ptr) {
    delete [] ptr; //ptr = 0x12345678 
    ptr = NULL; //ptr = NULL 
}

在C中,你需要传递指针到指针,这基本上是一样的,只是语法不那么漂亮。

不需要修改主叫号码。但是你必须在调用时给出一个可修改的变量作为参数,不能给出例如NULLnullptr,就像你不能做&NULL一样。

如果您真的想以如此复杂、容易出错的方式管理内存,那么传递调用者指针的引用,而不是副本:

void changePtr(char *&ptr)
//                   ^

使用智能指针要好得多;它们被设计成当目标被删除时很难让它们悬空:

int main()
{
    std::unique_ptr<char[]> ptr(new char[1024]); //assume PTR = 0x12345678
    changePtr(ptr);  //after calling this,
                     //ptr is empty here.
    return 0;
}
void changePtr(std::unique_ptr<char[]> & ptr)
{
    ptr.reset();
}

虽然如果我想要一个动态数组,我会完全避免new而使用std::vector

我看到了很多关于如何检查指针有效性的问题。其中很多问题都是关于Windows的。可能没有一种通用的方法来检查c++,但是对于Windows特定的解决方案,下面的方法似乎在我的系统上有效:

#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
    MEMORY_BASIC_INFORMATION lpBuffer;
    int cActualBytes;
    cActualBytes = VirtualQuery(&main, &lpBuffer, sizeof(lpBuffer));        // Can we get info about main?
    if (!cActualBytes)
    {
        printf("Nope, you can't do that n");
        return 2;
    }
    if (cActualBytes != sizeof(lpBuffer))
    {
        printf("Surprise!  Expected %d bytes, got %dn", sizeof(lpBuffer), cActualBytes);
    }

    printf("Information for mainn");
    printf("---------------------------n");
    printf("C reports pointer %p, Virtual Alloc sees it as %pn",&main,lpBuffer.BaseAddress);
    return 0;
}