分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放



我有一个类,其方法在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 是全局数据段,它位于全局数据段上,独立于堆和堆栈。

因此,您可以看到deleteexample对象的析构函数不会释放分配给存储指针本身的内存,因为两者都没有这样做的权限。

编辑------------------

正如其他人所说,static变量在程序的生命周期内存在,因此在程序终止之前它们不会被删除。

这里有很多东西可以收集! static一开始可能会令人困惑,但对它的深入了解有很长的路要走。

任何

声明为static的东西都会在程序的生命周期中存在。它是在第一次可能使用之前构造的,并在程序终止期间(即,在main返回或调用exit之后)未完全指定的时刻销毁。

此外,销毁(非智能)指针永远不会销毁指针指向的东西。如果要释放指针指向的资源,则必须在指针上显式调用delete。(或者使用智能指针。做。它们更好。

通常,静态全局变量不是成员变量,因此在分配或删除类时,除非类成员显式分配或释放静态全局变量的内存,否则对静态全局变量没有影响。

在您的示例中,您只是分配一个指向全局变量的指针,而不是分配新内存。因此,您不需要显式释放它。

另外,你不需要在main()中调用delete,因为eg1是一个局部变量。当 main 返回时,将自动调用 eg1 的析构函数。

No.static指针对象与类example没有内在链接,当然也没有与对象eg1的内在链接。如果系统仅仅因为eg1超出范围而破坏ptr,语言将非常破碎。

相关内容

  • 没有找到相关文章

最新更新