2010-04-09 70 views
8

C++以相反的顺序自动调用块中所有局部变量的析构函数,无论块是否正常退出(控制通过)或抛出异常。在C++中通常调用一个块时如何销毁局部变量?

看起来像术语stack unwinding只适用于后者。调用关于销毁局部变量的前一个过程(块的正常退出)如何?

+1

它确实不叫任何东西。在标准的任何地方,它都会说“像自动变量在块的末尾被销毁”。它永远不会给这个过程一个名字。 – GManNickG 2010-04-09 06:54:24

+0

@GMan - 拯救独角兽:我想你可以添加这个作为答案。提到标准所说的是一个有力的论点。 – sharptooth 2010-04-09 07:44:03

回答

5

当“超出范围”时,对象会自动被销毁。这可以称为“自动存储回收”,但实际上是指垃圾回收(有几篇论文中使用该术语来表示垃圾回收)。当它被用来确保开放/关闭,锁定/解锁或其他形式的资源获取与其适当版本的适当配对时,则它被称为Resource Acquisition is Initialization (RAII)的设计模式,这有点具有讽刺意味,因为RAII的主要方面不是资源初始化或收购,而是其销毁。

2

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

1

我不确定这是否有名称。堆栈变量是,所以自动,没有人担心他们,甚至不足以给这个自动清理过程的名称。

我把它称为“超出范围”。

1

我一直听说它是“超出范围”,或者更准确地说是“一个auto变量超出范围”。

1

如果你要问的是如何调用该方法是在机器码实际执行,我会说这将取决于调用约定用过

3

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

当引发异常时,处理程序将通过零个或多个方法展开堆栈,直到找到能够捕获该异常的堆栈,或者直到它到达堆栈的顶部,此时未处理的异常处理程序将为调用。

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