【问题标题】:Constructor and Destructor for static member variable (a pointer)静态成员变量(指针)的构造函数和析构函数
【发布时间】:2020-07-15 07:11:54
【问题描述】:

我正在研究一类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 的所有实例被销毁后调用析构函数。

【问题讨论】:

  • 为什么不使用static std::unique_ptr&lt;ex2&gt; y;
  • 由于内存是在静态范围内分配的,应该在程序退出时将其删除,另请参见atexit 函数。或者只是按照@DavidSchwartz 的建议使用智能指针。

标签: c++ pointers static destructor explicit-destructor-call


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢。这个对我有用。也感谢有用的建议。我会尝试更改我的代码。
猜你喜欢
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多