9

C++ 自动以相反的顺序调用块中所有局部变量的析构函数,无论该块是正常退出(控制失败)还是抛出异常。

看起来术语堆栈展开仅适用于后者。关于销毁局部变量,如何调用前一个进程(块的正常退出)?

4

6 回答 6

5

当对象“超出范围”时,它会自动销毁。这可以称为“自动存储回收”,但实际上是指垃圾收集(有几篇论文在其名称中使用该词来表示垃圾收集)。当它用于确保打开/关闭、锁定/解锁或其他形式的资源获取与它们的适当释放正确配对时,它被称为资源获取是初始化(RAII)的设计模式,这有点讽刺RAII的主要方面不是资源的初始化或获取,而是资源的销毁。

于 2010-04-09T05:58:59.320 回答
3

在这两种情况下都会发生堆栈展开,只是在正常执行下,当执行方法返回(或退出块)时,堆栈仅在调用方法(或块)的上下文中展开。局部变量是在栈上分配的,所以按照分配的相反顺序清理它们,这个过程称为展开。这与处理存储在 LIFO 结构中的任何其他类型的数据没有什么不同——例如撤消、重做。

当抛出异常时,处理程序将通过零个或多个方法展开堆栈,直到找到可以捕获异常的方法,或者直到它到达堆栈顶部,此时将调用未处理的异常处理程序。

在异常处理的情况下只使用术语堆栈展开似乎是惯例,但在每种情况下都会发生相同的过程。由于方法退出而导致堆栈展开的特定情况称为返回,似乎没有任何约定来命名退出范围代码块时发生的情况。

于 2010-04-09T06:37:02.700 回答
2

局部变量在超出范围时被销毁。也许这个过程被称为“超出范围”?

于 2010-04-09T05:58:38.310 回答
1

我不确定这个有什么名字。堆栈变量是如此自动,以至于没有人担心它们,甚至不足以为这个自动清理过程命名。

我猜叫它“超出范围”。

于 2010-04-09T05:58:58.273 回答
1

我一直听到它被称为“超出范围”或更准确地说是“auto变量超出范围”。

于 2010-04-09T05:59:11.327 回答
1

如果您要问的是方法调用是如何在机器代码中实际实现的,我会说这取决于使用的调用约定

于 2010-04-09T06:22:03.163 回答