[英]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)中失败。 我正在变量之间重用堆栈空间,类似于这些问题中描述的内容:
除了我没有嵌套的作用域。 相反,代码看起来与此类似:
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.