读书人

两种代码作派你用哪种 ? 还是其他

发布时间: 2013-11-21 23:38:25 作者: rapoo

两种代码风格,你用哪种 ? 还是其他?
其一:


//假设:后面的变量均依赖前面的变量,p4 -> p3 ->p2 ->p1
int Test()
{
char* p1 = new char[10];
if (!p1)
{
return -1;
}
char* p2 = new char[11];
if (!p2)
{
delete p1;
return -1;
}
char* p3 = new char[12];
if (!p3)
{
delete p1;
delete p2;
return -1;
}
char* p4 = new char[13];
if (!p4)
{
delete p1;
delete p2;
delete p3;
return -1;
}

//do something
//...
//

delete p1;
delete p2;
delete p3;
delete p4;

return 0;
}


其二:

//假设:后面的变量均依赖前面的变量,p4 -> p3 ->p2 ->p1
int Test()
{
char* p1 = new char[10];
if (!p1)
{
goto error;
}
char* p2 = new char[11];
if (!p2)
{
goto error;
}
char* p3 = new char[12];
if (!p3)
{
goto error;
}
char* p4 = new char[13];
if (!p4)
{
goto error;
}

//do something
//...
//
done:
return 0;

error:
if(p1)delete p1;
if(p2)delete p2;
if(p3)delete p3;
if(p4)delete p4;
return -1;
}


我基本不怎么用异常,主要就这两种,不知道大家是怎么做的呢。
[解决办法]
一般用第一种,多重循环才用goto
[解决办法]
第二种吧,但很多人不喜欢使用goto,VC的书都说,避免使用goto,但是ms的许多例子倒是经常看到使用goto
仁者见仁智者见智
[解决办法]
int Test()
{
char *p1=new char[10];
char *p2=new char[11];
char *p3=new char[12];
char *p4=new char[13];

bool s=(NULL!=p1)&&(NULL!=p2)&&(NULL!=p3)&&(NULL!=p4);
if(s)
{
//做爱 做的事
}

delete p1;
delete p2;
delete p3;
delete p4;

if(s) return 0;
else return -1;
}

[解决办法]
if (!p1)
执行不到这一句,new失败就直接抛异常。
所以这些判断是白写的,没用。
[解决办法]
引用:
//假设:后面的变量均依赖前面的变量,p4 -> p3 ->p2 ->p1



你只细回味逻辑关系
[解决办法]

char *p1 = NULL, *p2 = NULL, *p3 = NULL, *p4 = NULL;
if ((p1 = new char[10]) && (p2 = new char[11]) && (p3 = new char[12]) && (p4 = new char[13]))
{
// do something
}

delete[] *p4;
delete[] *p3;
delete[] *p2;
delete[] *p1;

[解决办法]
在进行“逻辑与”比较时,如果最右边的等式不为 TRUE,则后面的等式不会继续执行

而删除内存时可以不作是否为 NULL 的判断的,因为 delete 的源代码里头自己会进行判断的
[解决办法]
记忆中VS中使用goto的函数必须是C风格,因此第二个严格来说编译错误吧。
对于使用MFC来说,还是使用第一种风格比较好。尽管你在MSDN能见很多示例里使用goto,但是SDK本身就是大部分使用标准C编译的,C++人员来说尽量少使用这种方式。
当然goto本身也有许多优点,比如多层次的循环中,但是从可读性来讲应尽量避免。

读书人网 >VC/MFC

热点推荐