推迟析构函数的调用
Postponing the call of a destructor
>假设程序有两个参数,其中一个是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 用于在自动数组中构造对象时,在数组超出范围之前,必须显式销毁对象。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常