- 论坛徽章:
- 0
|
C/C++中内存泄漏是最被诟病的问题,C++借助析构的便利有效抑制了一些内存泄漏,
而C语言就很无助了.要么增加新语法,要么在写法上做些预防.
内存申请和释放像一对双胞胎,释放多了少了都成问题:
char* buff=(char*)malloc(80);
...
free(buff); //必须一次
观察C++中析构的时机,它总出现在}之时,我们也可以利用{}这对双胞胎来帮忙:
{ char* buff=(char*)malloc(80);
...
free(buff); //必须一次
}
规则就是:紧跟{后同一行的是申请;紧挨}行前的是释放.分析一下这么写的效果:
1. 申请与{在同一行,容易辨认检查
2. 释放紧挨}也容易辨认检查
3. 如果忘了释放,也会少写},肯定编译不过
4. 申请的变量只在{}有效,在后面重复释放也编译不过
还是有些效果的,但写法让人不舒服, 因为{}关系到缩进,也不利于搜索,改进一下:
#define _ {
#define __ }
_ char* buff=(char*)malloc(80);
...
free(buff);
__
_像后缩,__像空行,很容易辨认, 如果申请了多个资源变量,多个__可以合并在一行:
_ char* buff=(char*)malloc(80);
...
_ CThis t;
CThis_CThis(&t); //构造
...
CThis_(&t); //析造
free(buff);
__ __
当然这种写法肯定不能解决所有问题,在_和__之间的break continue和return不受约束.
但代码比原来清晰,也比原来容易检查出错误.
最后,我给出一个彻底解决释放的问题,就是增加新语法:
{
: //无名标号,不能跳过
}
在 {}中加入可选的:,break continue和return都必须执行. |
|