所以,假设你有理由使用goto ...只是为了避免关于为什么应该/不应该使用它们的不可避免的争论。
当你声明一个变量mid函数时会发生什么,比如一个指向一些必须被释放的内存的指针,并且流量控制完全跳过该变量?
int foo(char* bar)
{
if (NULL == bar)
{
printf("ERR1\n");
goto out;
}
char* late = malloc(10 * (*bar));
if (NULL == late)
{
printf("ERR2\n");
goto out;
}
// More logic here
if (1)
{
printf("ERR3\n");
goto out;
}
// etc
out:
free(late);
return 0;
}
有些情况下,在'out:'中,你肯定想要释放分配给变量'late'的内存(例如它掉落或来自'ERR3')。在函数的早期也有一些情况,即使还没有创建迟到,你跳过它们。
通常,在声明这样的局部变量时,在汇编中,有一些堆栈操作可以移动堆栈指针以获得容纳新变量的空间。我希望goto对标签的无条件分支操作起作用。在函数结束时,当堆栈指针被调整时,所有本地成员都会离开堆栈,因此控制权可以返回给调用者。
那么,当我们点击'ERR1'时,'late'变量会发生什么?是否在堆栈上创建了空间? “免费”通话如何在“结束”标签之后工作?