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

问题描述 投票:1回答:1

我正在研究一个需要一个静态成员变量ex1的类y。该静态成员变量是指向类ex2的对象的指针,该类具有自己的构造函数和析构函数。现在,我知道如何通过在类外部定义变量y来对其进行初始化。但是,如何为变量y调用析构函数呢?我需要使用delete语句,但是要在哪里放置该语句。我需要同时调用类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的析构函数。同样,在销毁所有类ex1的实例之后,也需要调用析构函数。

c++ pointers static destructor explicit-destructor-call
1个回答
1
投票

您可以创建常规类,该类在销毁时会在指针上调用delete

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

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

PS:以我的经验,您应该避免在自动初始化和自动销毁过程中放置​​过多的逻辑。有一些事情需要引起高度关注(进行销毁时,系统的哪些部分仍然可用?在构建过程中哪些部分已经可用?),此外,调试器之类的工具在那段时间不能很好地工作。例如,通常,在启动main或完成main之后,绝不应该执行由于任何原因而失败的任何操作,因为这将很麻烦(如果错误记录子系统不是,如何在初始化期间记录错误?尚未初始化吗?如果日志记录系统已经关闭,如何在关闭期间记录错误?)。

我还认为C ++标准规范对这些问题有些模糊,因此您可能会因编译器而感到惊讶,并且多年来,我更倾向于从懒惰/自动初始化和销毁​​转向在main中完成的显式初始化和销毁​​。我想要的顺序,我知道是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.