我在C程序中找到了以下代码:
while (1)
{
do_something();
if (was_an_error()) break;
do_something_else();
if (was_an_error()) break;
[...]
break;
}
[cleanup code]
Run Code Online (Sandbox Code Playgroud)
这里while(1)用作"终于"的本地模拟.你也可以用gotos 写这个:
do_something()
if (was_an_error()) goto out;
do_something_else()
if (was_an_error()) goto out;
[...]
out:
[cleanup code]
Run Code Online (Sandbox Code Playgroud)
我认为goto解决方案是一种常用的习惯用法.我在内核源代码中看到过几次这种习惯用法,在Diomidis Spinellis的"代码阅读"一书中也提到过.
我的问题是:什么解决方案更好?有没有具体的理由使用该while(1)解决方案?
问题943826没有回答我的问题.
通常你有一个函数,对于给定的参数,它不能生成有效的结果,或者它不能执行某些任务.除了在C/C++世界中不常用的例外之外,基本上有两个学校报告无效结果.
第一种方法将有效返回与不属于函数的codomain的值(通常为-1)混合并指示错误
int foo(int arg) {
if (everything fine)
return some_value;
return -1; //on failure
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是返回函数状态并将结果传递给引用
bool foo(int arg, int & result) {
if (everything fine) {
result = some_value;
return true;
}
return false; //on failure
}
Run Code Online (Sandbox Code Playgroud)
您更喜欢哪种方式?为什么?第二种方法中的附加参数是否会带来显着的性能开销?
处理可能按顺序发生的多个malloc错误的推荐方法是什么,如下面的代码所示?
bool myFunc(int x, int y)
{
int *pBufX = null;
int *pBufY = null;
if((x <= 0) || (y <= 0))
{
return false;
}
pBufX = (int*)malloc(sizeof(int) * x);
if(pBufX == null)
{
return false;
}
pBufY = (int*)malloc(sizeof(int) * y);
if(pBufY == null)
{
free(pBufX) //free the previously allocated pBufX
return false;
}
//do something useful
free(pBufX);
free(pBufY);
return true;
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,如果malloc的数量很高,您可能会忘记释放一些并导致内存泄漏.此外,如果在发生错误时需要输出某种日志,则代码会变得很长.
我已经看到了用goto处理这些代码的代码,你可以在一个地方清除所有的mallocs,只有一次.代码不长,但我不喜欢使用gotos.
有没有比这两种方法更好的方法?
也许问题在于设计首先.在设计函数时,最小化多个mallocs是否有经验法则?
编辑:我已经看到并使用过另一种方式.您不保留使用goto,而是保留程序的状态,并仅在状态为OK时继续.类似于goto但不使用goto.但是这增加了可能使代码运行速度变慢的if语句数.
bool myFunc(int x, int y)
{
int *pBufX = null;
int …Run Code Online (Sandbox Code Playgroud)