c++删除静态数据
C++ Deleting Static Data
如果我有一个类,它包含分配在堆上的私有静态数据,永远不会改变,什么时候,如果有的话,我应该删除它?
据我所知,类本身永远不会被构造(因为类在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();
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 内联静态数据的初始化
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 关于静态常量数据模因的声明和定义的混淆
- 何时需要定义类的静态数据成员 (un/-)
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么静态数据成员不能在c++11中的类中初始化
- 访问模板化类的非模板基的静态数据
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- 是否允许在作为静态数据结构成员的lambda函数中捕获变量
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员