- 论坛徽章:
- 0
|
原帖由 mmmixx 于 2007-8-9 20:39 发表 ![]()
我举这个例子是想说明,如果你需要判断指针是否为空才敢释放内存,这说明你程序已经写得太乱了,你可能根本也忘了是否有多个指针指向同一空间,然后导致重复释放内存!
同意!
你这个例子和我举的那 ...
"判断指针是否为空才敢释放内存,这说明你程序已经写得太乱了"?
有这种说法的人, 是因为写大规模应用程序和关键应用的机会太少了, 不知道别人的原意是什么, 为什么必须这样做.
首先, 在C/C++里, malloc或者new操作符, 并不一定能够真正返回你需要的内存, 尤其是大量并发线程的应用程序中更是如此. 在很多操作系统中, 包括AIX, 在常规内存模式下,内存只能使用到160M左右, 如果不用大内存模式编译,在并发量大时,内存很容易用完. 因此任何写关键应用的程序员, 都要有这个观念: 每次申请内存后, 都要检查是否成功才能使用, 检查方法就是判断指针是否为空.
其次, 在C/C++里, 如果释放一个空指标, 程序是会CORE DUMP的, 因此每次释放内存之前, 都要判断一下是否为空.
最后, 即使不存在内存申请不成功的情况, 但由于其它代码内存越界将自已定义的指针清空的情况也是有的, 为保证应用程序的强壮性和容错能力, 释放前判断是否为空也是必要的. 当然, 这种处理方式会带来的代价是有可能纵容了内存泄漏,但两害相比取其轻,对提供程序稳定性还是有意义的.
下面举个程序异常简单且很不乱的例子, 说明判断是否为空的重要性:
int func1()
{
char* ptr=new char[102400000];
if (ptr==NULL)
{
......//....在这里进行系统内存不足时的应急处理
}
else
{
...... //这里使用内存做自已的事情
}
if (ptr==NULL) delete[] ptr; //如果不判断指针且内存未申请成功, 或者别人的代码在前面的处理过程中,因内存越界等原因针ptr清空了,此处的释放会造成程序core dump
}
[ 本帖最后由 zszyj 于 2007-8-9 21:10 编辑 ] |
|