我有一个类,其方法在example中定义.cpp file和class在example.h中定义。在示例.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) 肯定会被释放,但是分配给全局静态指针本身(静态示例* 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
一开始可能会令人困惑,但对它的深入了解有很长的路要走。
声明为static
的东西都会在程序的生命周期中存在。它是在第一次可能使用之前构造的,并在程序终止期间(即,在main
返回或调用exit
之后)未完全指定的时刻销毁。
此外,销毁(非智能)指针永远不会销毁指针指向的东西。如果要释放指针指向的资源,则必须在指针上显式调用delete
。(或者使用智能指针。做。它们更好。
通常,静态全局变量不是成员变量,因此在分配或删除类时,除非类成员显式分配或释放静态全局变量的内存,否则对静态全局变量没有影响。
在您的示例中,您只是分配一个指向全局变量的指针,而不是分配新内存。因此,您不需要显式释放它。
另外,你不需要在main()中调用delete,因为eg1是一个局部变量。当 main 返回时,将自动调用 eg1 的析构函数。
No.static
指针对象与类example
没有内在链接,当然也没有与对象eg1
的内在链接。如果系统仅仅因为eg1
超出范围而破坏ptr
,语言将非常破碎。