静态成员变量(指针)的构造函数和析构函数

Constructor and Destructor for static member variable (a pointer)

我正在研究 class ex1,它需要一个静态成员变量 y。该静态成员变量是指向 class ex2 对象的指针,它有自己的构造函数和析构函数。现在我知道如何通过在 class 之外定义它来初始化变量 y。但是如何调用变量 y 的析构函数呢?我需要使用 delete 语句,但该语句放在哪里。我需要调用 class ex2.

的构造函数和析构函数

下面显示了我的问题的等效代码和输出:

#include<iostream>

class ex2 {
public:
  int n;
  ex2(int num) {
    n = num;
    std::cout << "Constructor of ex2\n";
  }
  ~ex2(){std::cout << "Destructor of ex2\n";}
};

class ex1 {
public:
  static ex2 *y;  //static member variable
  ex1() {std::cout << "Constructor of ex1\n";}
  ~ex1() {std::cout << "Destructor of ex1\n";}
};

ex2 *ex1::y = new ex2(90); //definition for static member

int main()
{
  ex1 y1;
  return 0;
}

此输出为:

Constructor of ex2
Constructor of ex1
Destructor of ex1

请帮助如何调用 ex2 的析构函数。 class ex1 的所有实例都被销毁后,还需要调用析构函数。

您可以创建常规 class,在销毁时在您的指针上调用 delete

struct Destroyer {
    ex2 *p;
    ~Destroyer() { delete p; }
};

ex2 *ex1::y = new ex2(90);
Destroyer dex2{ex1::y};

PS:根据我的经验,你应该避免在自动初始化和自动销毁期间放置太多逻辑。有一些事情需要高度注意(在销毁时系统的哪些部分仍然可以使用?哪些部分在构建过程中已经可以使用?)而且我发现在那个时候连调试器这样的工具都不能很好地工作。例如,作为一个规则,在 main 启动之前或 main 完成之后,你永远不应该做任何可能因任何原因而失败的事情,因为这将是一个管理起来的痛苦(如果错误记录子系统不是',你怎么能在初始化期间记录错误'尚未初始化?如果日志系统已经关闭,如何在关闭期间记录错误?)。

我还认为 C++ 标准规范对这些问题有些模糊,因此根据编译器的不同,您可能会感到惊讶,多年来我更喜欢从 lazy/automatic 初始化和销毁​​转移到显式初始化和销毁​​完成在 main 中按我想要的并且我知道是正确的顺序排列。