C检查指针是否有效?

时间:2013-03-13 19:25:26

标签: c++ pointers

我在使用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?

4 个答案:

答案 0 :(得分:7)

将changePtr的签名更改为:

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

并使用以下方式调用它:

changePtr(&ptr);

答案 1 :(得分:6)

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

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

在C中,你需要将指针传递给指针,这基本上与不太漂亮的语法相同。

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

答案 2 :(得分:3)

如果你真的想以这种复杂的,容易出错的方式管理内存,那么就传递一个引用,而不是调用者指针的副本:

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

答案 3 :(得分:0)

我已经看到很多关于如何检查指针的有效性的问题。关于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 %d\n", sizeof(lpBuffer), cActualBytes);
    }


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

    return 0;
}