【问题标题】:Postponing the call of a destructor推迟析构函数的调用
【发布时间】:2020-06-10 19:02:46
【问题描述】:

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

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

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

自动 4

那么程序必须产生以下输出:

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

程序已求解为动态。

对于自动类型,如果我使用for 循环来实现它,那么每个析构函数都会在构造函数之后调用。如何“延长”此类对象的寿命?

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

【问题讨论】:

  • 延长到什么寿命?这正是自动生命周期是什么,你想扩展到什么?
  • 我想为'anywhere'类的对象计数次数,然后调用它们的析构函数。根据问题,它们应该具有自动生命周期。
  • 你已经在这样做了。除非您的意思是要确保它在以相同顺序销毁它们之前创建 count 对象。这是您无法真正做到的,因为它涉及 动态 数据
  • 使用递归创建它们。现在您所要做的就是在递归堆栈展开之前弄清楚如何在递归堆栈底部访问它们。
  • 谢谢,线程呢?我可以制作多个胎面对象吗?

标签: c++ oop


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 2011-04-16
    • 2015-10-07
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多