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()函数的某个点检查指针的地址以避免异常.在此先感谢您的帮助和见解!
只有当它们是全局或静态时,指针才会被神奇地初始化为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.
| 归档时间: |
|
| 查看次数: |
282 次 |
| 最近记录: |