我有一个类,其方法在 example.cpp 文件中定义,类在 example.h 中定义。 example.cpp 文件中定义了一个静态全局指针。 (我需要在 .cpp 中将此指针定义为静态全局指针,因为它在裸机系统上运行的静态中断服务例程中被调用。)我想知道何时删除此类的实例,是分配给这个静态全局指针的内存,在类外定义(在 cpp 文件内作为静态全局变量),也释放了?我担心内存泄漏问题。 (请不要用智能指针建议任何东西,谢谢)
// example.cpp
#include <example.h>
static example* ptr;
example::example(){ prt = this; }
example::~example(){}
// example.h
class example
{
public:
example();
virtual ~example();
int a;
};
//main.c
void main(void)
{
while(1){
example eg1;
delete &eg1;
}
//Has all the memory allocated to eg1 been freed up including the global static variable(a pointer)?
}
我知道一旦对象被删除,对象内部的 (int a) 肯定会被释放,但是分配给全局静态指针本身的内存 (static example* ptr) 是否也会被释放? (我假设)如果静态全局变量不是由类的所有实例共享,它是否实际为这个静态全局变量分配内存但在删除实例后不释放它?会不会导致内存泄露?
第一次在这里提问。如果有任何不清楚的地方,请提前致歉。
最佳答案
首先,如果你运行你发布的代码,你会得到以下信息:
malloc: *** error for object 0x7fff560a8830: pointer being freed was not allocated
这是因为您删除了 &eg1
而没有首先使用 new
在堆上为其分配内存。
其次,析构函数/delete
只会清理与example
对象关联的内存。它没有义务清理static example* ptr
。
从另一个角度来看,析构函数和delete
旨在清理动态分配的数据,即存在于堆中的数据,而不仅仅是当前函数调用的堆栈中的数据。相比之下,static example* ptr
是一个全局的,它位于全局数据段上,与堆和栈分开。
因此,您可以看到 delete
和 example
对象的析构函数不会释放分配给存储指针本身的内存,因为两者都没有这样做的权限。
编辑--------------------
正如其他人所说,static
变量在程序的整个生命周期内都有效,因此在您的程序终止之前它们不会被删除。
这里有很多值得收集的东西! static
一开始可能会令人困惑,但对它有很好的了解会大有帮助。
关于c++ - 在 C++ 中删除其类的实例后,是否释放了分配给 cpp 中定义的全局静态变量的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020014/