- 论坛徽章:
- 0
|
原帖由 zszyj 于 2007-8-9 21:05 发表 ![]()
每次申请内存后, 都要检查是否成功才能使用, 检查方法就是判断指针是否为空.
在 C 里,的确如此,在 C++ 里就不然了。
其次, 在C/C++里, 如果释放一个空指标, 程序是会CORE DUMP的, 因此每次释放内存之前, 都要判断一下是否为空. From C99 7.20.3.2 The free function
The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs.
From C++98 5.3.5 Delete
if the value of the operand of delete is the null pointer the operation has no effect.
最后, 即使不存在内存申请不成功的情况, 但由于其它代码内存越界将自已定义的指针清空的情况也是有的, 为保证应用程序的强壮性和容错能力, 释放前判断是否为空也是必要的. 当然, 这种处理方式会带来的代价是有可能纵容了内存泄漏,但两害相比取其轻,对提供程序稳定性还是有意义的.
舍本求末的做法,干嘛为了掩盖一个错误而引进更多的(潜在)错误呢!按照这种说法,它分分钟可能将合法的指针值变成非法的指针值,也可能将 NULL 指针值变成非 NULL。这又当怎么讲?
int func1()
{
char* ptr=new char[102400000];
if (ptr==NULL)
{
......//....在这里进行系统内存不足时的应急处理
}
else
{
...... //这里使用内存做自已的事情
}
if (ptr==NULL) delete[] ptr; //如果不判断指针且内存未申请成功, 或者别人的代码在前面的处理过程中,因内存越界等原因针ptr清空了,此处的释放会造成程序core dump
}
还没学懂 C++ 吧,new 失败默认是抛出异常的!
[ 本帖最后由 mmmixx 于 2007-8-9 21:54 编辑 ] |
|