2011-06-03 43 views
2

我有一个zap()函数写入释放1-d数组,如下所示。如果它没有分配内存,我可以创建一个C++“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()函数中的某个点检查指针的地址以避免异常。预先感谢您的帮助和见解!

+1

你的测试是多余的,因为如果数据为0,delete []数据已经是空操作。 – 2011-06-04 08:36:12

回答

7

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

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

如果你不这样做,它们含有被留在那里它们被创建在栈上随机的垃圾。而这个垃圾大部分时间是而不是NULL

而且,你也不需要对证NULL,作为delete是无操作在这种情况下:

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

此外,如果你正在使用Visual Studio 2010的工作,我建议使用nullptr而不是NULL

+0

完美!解决了我的问题,我也学到了一些东西。 – Joe 2011-06-03 20:59:09

0

xvec和yvec的值指向随机数,而不是NULL。我觉得你的allocate_memory功能不能正常工作,因为它通常会一个指向的内存块,你将会分配给XVEC和YVEC

0

在C++中指针没有自动的初始化为NULL,如其他语言(思考Java),所以xvec(指针)的值是未定义的,并且在测试时可能不是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功能测试空(或0),delete不会导致不确定的行为,如果叫上一个空指针:

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

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

因此,我会说,试图解决您的zap有点像找到找到一个女人谁一直只是在发生火灾,并得到3 度烧伤对她的身体的至少85%,并试图通过修剪她在逃离火场时破裂的指甲让她更好。

相关问题