gpt4 book ai didi

c++ - c++中堆栈分配数据的生命周期

转载 作者:搜寻专家 更新时间:2023-10-31 00:16:20 27 4
gpt4 key购买 nike

我的 C++ 代码可以在 Debian (gcc (Debian 4.7.2-5) 4.7.2) 中正常运行,但在 Ubuntu (gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2) 中会失败。我正在变量之间重用堆栈空间,类似于这些问题中描述的内容:

In C, do braces act as a stack frame?

C++ stack and scope

除非我没有嵌套范围。相反,代码看起来类似于:

TreeWalker walker;
walker.addVisitor(nodeType1, Visitor1());
walker.addVisitor(nodeType2, Visitor2());
...
walker.walkTree(tree);

我可以通过在堆上分配来缓解这个问题,但我想知道我该怎么做才能确保局部变量保留在原地?将访问者分配给局部变量是否足以确保它们不会被重用?在函数代码中最后一次使用后,标准是否对堆栈变量提供任何 promise ?

最佳答案

what can I do to make sure that local variables are left in place?

要么使用(命名的)局部变量,而不是临时变量;或修改 addVisitor 以存储访问者的拷贝而不是对其的引用(如果可行)。

Would assigning visitors to local variables be enough to ensure they won't be reused?

是的。

Does standard provides any promise on the stack variables after their last use in function code?

临时对象(在表达式中创建的未命名对象,例如您创建的访问者)一直存在到创建它们的完整表达式结束为止。所以它们一直持续到调用 addVisitor 返回,但在下一行之前被销毁。

局部变量(在代码块中声明的自动变量)持续到程序离开声明它们的最内层 block 。当发生这种情况时,该 block 中的每个局部变量都按照它们声明的相反顺序被销毁。所以在下面:

{
Visitor1 visitor1;
Visitor2 visitor2;
TreeWalker walker;
walker.addVisitor(nodeType1, visitor1);
walker.addVisitor(nodeType2, visitor2);
//...
walker.walkTree(tree);
}

保证 walker 将在访问者之前被销毁,因此即使在其析构函数中也不会包含任何悬空引用。

关于c++ - c++中堆栈分配数据的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16414015/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com