我可以创建一个C++"zap"函数,如果它没有分配内存,它可以在指针上运行吗?

Joe*_*Joe 2 c++ memory-management

我编写了一个zap()函数来解除分配1-d数组,如下所示.

void zap(double *(&data))
{
    if (data != NULL)
    {
       delete [] data;
       data = NULL;
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

我的印象是if data != NULL不会试图释放从未分配过的记忆,但我认为我错了.我有以下实施问题.

void fun()
{
    int condition = 0;
    double *xvec;
    double *yvec;
    allocate_memory_using_new(yvec); //a function that allocates memory
    if (condition == 1) allocate_memory_using_new(xvec);
    //some code
    //deallocate memory:
    zap (yvec);
    zap (xvec); //doesn't work
    return;
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

 Unhandled exception at 0x6b9e57aa (msvcr100d.dll) in IRASC.exe: 0xC0000005: Access
 violation reading location 0xccccccc0.
Run Code Online (Sandbox Code Playgroud)

所以我意识到当显然指针从未被实际使用时,尝试调用zap并不是一件令人向往的事情.我只是想知道是否有办法在zap()函数的某个点检查指针的地址以避免异常.在此先感谢您的帮助和见解!

Xeo*_*Xeo 7

只有当它们是全局或静态时,指针才会被神奇地初始化为0.需要这样做:

double *xvec = NULL;
double *yvec = NULL;
Run Code Online (Sandbox Code Playgroud)

如果不这样做,它们会包含留在堆栈中的随机垃圾.而这个垃圾大部分时间都没有 NULL.

此外,您不需要检查NULL,delete在这种情况下是无操作:

double* xvec = NULL;
delete xvec; // perfectly valid
Run Code Online (Sandbox Code Playgroud)

此外,如果您正在使用Visual Studio 2010,我建议使用nullptr而不是NULL.