如果我有一个包含在堆上分配的永不更改的私有静态数据的类,那么何时(如果有的话)应该删除它?
据我所知,类本身从未构造(因为类不是C ++中的第一类对象),那么没有析构函数来删除静态数据?我是C ++的新人,很抱歉,如果我对c ++的理解存在根本性的缺陷或答案是显而易见的! 先谢谢你,
答案 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)
在堆上分配的静态数据意味着一个静态的成员指针。如果是这种情况,您可以为其分配内存。