繁体   English   中英

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

[英]Life span of stack allocated data in c++

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

在C语言中,花括号是否充当堆栈框架?

C ++堆栈和范围

除了我没有嵌套的作用域。 相反,代码看起来与此类似:

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

我可以通过在堆上分配来减轻此问题,但是我想知道如何做才能确保将局部变量保留在原处? 将访问者分配给局部变量是否足以确保它们不会被重用? 标准在函数代码中的最后使用后,是否对堆栈变量提供任何保证?

我该怎么做才能确保保留局部变量?

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

将访问者分配给局部变量是否足以确保它们不会被重用?

是。

标准在函数代码中的最后使用后,是否对堆栈变量提供任何保证?

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

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

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

这样可以确保walker在访问者之前被销毁,因此即使在其析构函数中也不会包含任何悬挂的引用。

Visitor1()不是局部变量,而是临时变量。 临时项的生存期在其中出现的完整表达式结束时终止。

如果需要保留它们,请为它们使用局部变量而不是临时变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM