如果指针尚未分配内存,是否可以创建一个在指针上运行的 C++ "zap" 函数?

Can I create a C++ "zap" function that works on a pointer if it hasn't had memory allocated to it?

本文关键字:指针 一个 运行 C++ 函数 zap 内存 分配 是否 创建 如果      更新时间:2023-10-16

我编写了一个zap()函数,用于如下释放一个一维数组。

void zap(double *(&data))
{
    if (data != NULL)
    {
       delete [] data;
       data = NULL;
    }
    return;
}

我的印象是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;
}

输出如下:

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

所以我意识到,当指针显然从未被实际使用时,尝试调用zap是不可取的。我只是想知道是否有一种方法可以检查zap()函数中某个点的指针地址,以避免出现异常。提前感谢您的帮助和洞察力!

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

double *xvec = NULL;
double *yvec = NULL;

如果不这样做,它们包含随机垃圾,这些垃圾留在创建它们的堆栈上。而且这种垃圾在大多数情况下是而不是NULL

此外,您不需要对照NULL进行检查,因为在这种情况下delete是无操作的:

double* xvec = NULL;
delete xvec; // perfectly valid

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

xvec和yvec的值指向随机数,而不是NULL。我认为您的allocate_memory函数工作不正常,因为它通常会返回一个指向内存块的指针,您会将其分配给xvec和yvec

在C++中,指针不会像在其他语言(比如Java)中那样自动初始化为NULL,因此xvec(指针)的值是未定义的,在测试时可能是NULL,也可能不是NULL。

void fun()
{
    double *xvec; // value of xvec undefined, might be 0 or not
    // ...
    zap (xvec);   // if it is not 0, you will try to delete: Undefined Behavior
}

简单的解决方案是初始化定义double *xvec = 0;中的指针。此外,您不需要在zap函数中测试NULL(或0),如果在空指针上调用delete,则不会导致未定义的行为:

template <typename T>
inline void zap( T *& p ) {
   delete p;
   p = 0;
}

我已经得出结论,newdelete的数组形式符合C++反模式的条件——它们看起来很合理,但实际上几乎所有对它们的使用都基本上保证会导致比可用代码更多的悲伤和问题。

因此,我想说,试图修复你的zap有点像发现一个刚刚在火灾中,身体至少85%被3rd度烧伤的女人,并试图通过修剪她在逃离火灾时折断的指甲来让她变得更好。