首页 > 解决方案 > 循环内的局部对象的析构函数是否保证在下一次迭代之前被调用?

问题描述

当我有一个循环并在此循环内创建一个新的堆栈变量(不将其分配在堆上并在循环体内声明它的变量)时,该对象的析构函数是否保证在下一次迭代开始之前被调用,或者可能由编译器展开的循环会改变什么?

标签: c++destructor

解决方案


来自n4800

§6.3.3块范围

在块 (8.3) 中声明的名称是该块的本地名称;它具有块范围。它的潜在作用域从它的声明点(6.3.2)开始,到它的块的末尾结束。在块范围内声明的变量是局部变量。

§10.3.6析构函数:

当创建对象的块退出时,会隐式调用析构函数 [...] (8.7)

§4.1.1抽象机

该规定有时被称为“好像”规则,因为只要从可观察到的行为可以确定,只要结果是好像已经遵守了该要求,实现就可以自由地忽略本文档的任何要求。程序

[强调我的]

所以,是的。您的变量在循环结束时超出范围(这是一个块),因此只要观察程序行为的任何人都知道,它的析构函数就会被调用。


推荐阅读