1 char* strA=new char[MAX_PATH];
2 if(GetXXX(strA, MAX_PATH)==ERROR) goto RELEASE_STRA;
3 char* strB=new char[MAX_PATH];
4 if(GetXXX(strB, MAX_PATH)==ERROR) goto RELEASE_STRB;
5
6 DoSomething(strA, strB);
7
8 RELEASE_STRB:
9 delete[] strB;
10 RELEASE_STRA:
11 delete[] strA;
相信这肯定是大家的常用模式。我在这里也不是教唆大家使用goto,不过对于这种例子来说,用goto是最优美的解决办法了。但是大家可以看出来,我们用的是C++,因为这里有new。如果DoSomething发生了异常怎么办呢?如果GetXXX发生了异常怎么办呢?我们这里没有任何的try-catch,一有异常,函数里克结束,两行可怜的delete就不会被执行到了,于是内存泄漏发生了!
那我们如何避免这种情况下的内存泄露呢?一些可爱的小盆友可能会想到,既然是因为没有catch异常才发生的内存泄露,那我们来catch吧:
1 char* strA=new char[MAX_PATH];
2 try
3 {
4 if(GetXXX(strA, MAX_PATH)==ERROR) goto RELEASE_STRA;
5 char* strB=new char[MAX_PATH];
6 try
7 {
8 if(GetXXX(strB, MAX_PATH)==ERROR) goto RELEASE_STRB;
10 }
11 catch()
12 {
13 delete[] strB;
14 throw;
15 }
16 }
17 catch()
18 {
19 delete[] strA;
20 throw;
21 }
22
23 RELEASE_STRB:
24 delete[] strB;
25 RELEASE_STRA:
26 delete[] strA;
你能接受吗?当然是不能的。问题出在哪里呢?因为C++没有try-finally。你看这些代码到处都是雷同的东西,显然我们需要编译器帮我们把这些问题搞定。最好的解决方法是什么呢?显然还是构造函数和析构函数。总之记住,如果想要事情成对发生,那么使用构造函数和析构函数。
第一步,GetXXX显然只能支持C模式的东西,因此我们要写一个支持C++的:
1 bool GetXXX2(string& s)
&nbs