0

我在 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

4 回答 4

7

将 changePtr 的签名更改为:

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

并使用以下方法调用它:

changePtr(&ptr);
于 2013-03-13T19:27:19.517 回答
6

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

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

在 C 中,您需要将指针传递给指针,这基本上是相同的东西,但语法不太漂亮。

您无需更改调用代码。但是调用时必须给出一个可修改的变量作为参数,不能给出例如NULLor nullptr,同样不能给出&NULL

于 2013-03-13T19:29:13.367 回答
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.

于 2013-03-13T19:31:52.187 回答
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;
}
于 2014-05-13T23:11:16.180 回答