C ++删除静态数据

时间:2011-07-27 19:21:00

标签: c++ memory-management static

如果我有一个包含在堆上分配的永不更改的私有静态数据的类,那么何时(如果有的话)应该删除它?

据我所知,类本身从未构造(因为类不是C ++中的第一类对象),那么没有析构函数来删除静态数据?我是C ++的新人,很抱歉,如果我对c ++的理解存在根本性的缺陷或答案是显而易见的! 先谢谢你,

5 个答案:

答案 0 :(得分:12)

如果数据是静态的,则不会在堆上分配,而且它将是 在关闭过程中被破坏。

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

Something* MyClass::aPointer = new Something;

然后像所有其他动态分配的数据一样,它只会 删除时会被破坏。有两种常见的解决方案:

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

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

答案 1 :(得分:11)

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

但是,如果在指针中使用static

static A *pA = new A();

然后您可以通过编写delete pA来删除它。但这并不会使我的第一个陈述失效。因为 static 指针指向的对象不是静态的。它的指针是静态的,而不是指针所指向的对象。

答案 2 :(得分:5)

您可以将此课程安排在std::auto_ptr。然后它将在程序关闭时自动删除。否则内存泄漏工具会抱怨你的班级泄漏。另一方面,这个内存泄漏是无害的,因为程序已经完成运行。

答案 3 :(得分:0)

我认为你实际上是指一个指向堆上对象的静态指针?

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

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

答案 4 :(得分:0)

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