推迟析构函数的调用

Postponing the call of a destructor

本文关键字:调用 析构函数 推迟      更新时间:2023-10-16

>假设程序有两个参数,其中一个是storage_duration_name,另一个是count。我们有一个名为anywhere的类,它有一个默认的构造函数和析构函数。程序必须一个接一个地创建<count>(不多也不少(的anywhere类型的对象,从索引参数值 0 开始,一直到并包括<count> - 1

storage_duration_name可以是自动、动态、静态或线程。

例如,如果命令行参数为:

自动 4

然后程序必须产生以下输出:

构造函数自动 0 构造函数自动 1 构造函数自动 2 构造函数自动 3 析构函数自动 3 析构函数自动 2 析构函数自动 1 析构函数自动 0

该程序已针对动态求解。

对于 Automatic 类型,如果我使用for循环实现它,则每个析构函数都在构造函数之后调用。 如何"延长"此类对象的使用寿命?

for (int i = 0; i < count; i++)
{
anywhere obj(storage_duration_name, i);
}

如果我理解正确,严格来说不可能分配任意数量的自动存储类对象。 自动变量是命名对象,因此需要任意数量的名称,每个变量一个。此外,尽管C++标准并不严格要求它,但在基于堆栈的CPU架构中,编译器将在堆栈帧中为解析器在函数主体中识别的所有自动对象分配空间。此空间在编译器时分配,因此函数参数无法更改它的大小。

有几种方法可以实现不同数量的伪自动变量。您可以编写一个函数模板,将数组的大小作为模板参数传递。然后在模板参数大小调整大小的自动数组上使用放置 new,或使用 std::array 执行相同的操作。可以假设最大数组大小并放弃模板参数,而不是使用模板参数。每当放置 new 用于在自动数组中构造对象时,在数组超出范围之前,必须显式销毁对象。