相关疑难解决方法(0)

而(1)..打破而不是转到

我在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 goto

17
推荐指数
7
解决办法
1万
查看次数

哪个学校的报告功能失败更好

通常你有一个函数,对于给定的参数,它不能生成有效的结果,或者它不能执行某些任务.除了在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)

您更喜欢哪种方式?为什么?第二种方法中的附加参数是否会带来显着的性能开销?

c c++ return return-value

8
推荐指数
3
解决办法
1014
查看次数

推荐的方法在C中的单个函数中处理多个malloc错误

处理可能按顺序发生的多个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)

c malloc error-handling

5
推荐指数
1
解决办法
289
查看次数

标签 统计

c ×3

c++ ×1

error-handling ×1

goto ×1

malloc ×1

return ×1

return-value ×1