c++删除静态数据

C++ Deleting Static Data

本文关键字:数据 静态 删除 c++      更新时间:2023-10-16

如果我有一个类,它包含分配在堆上的私有静态数据,永远不会改变,什么时候,如果有的话,我应该删除它?

据我所知,类本身永远不会被构造(因为类在c++中不是第一类对象),那么就没有析构函数来删除静态数据吗?我是c++的新手,所以很抱歉,如果我对c++的理解从根本上有缺陷,或者如果答案是显而易见的!先谢谢你了

如果数据是静态的,那么它不会在堆上分配,但将来会分配在进程关闭期间销毁。

如果是指向静态数据的指针,例如:

Something* MyClass::aPointer = new Something;

则像所有其他动态分配的数据一样,它只会是当你删除它时,它就被销毁了。有两种常见的解决方案:

  • 使用智能指针,它有一个析构函数可以删除它,或者

  • 不要删除;在大多数情况下,确实没有理由调用析构函数,如果碰巧在其他静态对象的析构函数中使用实例,则会遇到析构顺序问题。

static数据意味着,它持续整个程序的持续时间。

但是,如果您在指针中使用static作为:

static A *pA = new A();

则可以通过写入delete pA来删除它。但这并不能使我的第一个陈述无效。因为static指针所指向的对象不是静态的。指针是静态的,而不是指针指向的对象。

您可以将该类放置在std::unique_ptr中。然后在程序关闭时自动删除。否则,内存泄漏工具将抱怨您的类泄漏。另一方面,这个内存泄漏是无害的,因为程序已经完成运行。

我假设你实际上是指一个静态指针到堆上的对象?

永远不会自动删除,您必须自己删除。大多数情况下,让程序结束并由操作系统进行清理就足够了,除非您使用内存检查工具或析构函数有您需要的副作用。

最简单的方法是使用智能指针,它会在没有人再引用对象时自动删除它。您可以在main中保留指针的副本,如果没有人会有副本,那么该对象将在main退出时被删除。

static在堆上分配的数据意味着成员指针是静态的。如果是这种情况,您可以为它分配内存

我使用的这个解决方案是添加一个静态函数来释放内存。只是在关闭阶段的某个地方调用者需要调用这个函数。我不确定这种做法是好是坏;至少它清理了堆上分配的内存。很高兴听到评论。

class example {
   public:
      static void dealloThing() { delete ptr; }
      /**
       * You could have more elaborate arguments to set special version
       * of Thing, here not elaborating the details
       */
      static void setThing(Thing* tptr) { ptr = tptr; }
   private:
      static Thing* ptr;
};
==== example.cpp ===
Thing* example::ptr=new Example();