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

时间:2015-03-12 20:54:53

标签: c++ class memory-leaks static global-variables

我有一个类,其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)肯定会被释放,但是分配给全局静态指针本身的内存(静态示例* ptr)也会被释放吗? (我假设)如果静态全局变量没有被该类的所有实例共享,它是否实际为此静态全局变量分配内存,但在删除实例后却没有释放它?是否会导致内存泄漏?

这是我第一次在这里提出问题。如果有任何不明确的事情,请提前抱歉。

4 个答案:

答案 0 :(得分:2)

首先,如果你运行你发布的代码,你会得到以下结果:

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一开始可能会让人感到困惑,但对它的了解很长。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

否。 static指针对象没有类example的内在链接,当然也没有指向对象eg1的内在链接。如果系统因ptr超出范围而导致eg1被破坏,则该语言非常已损坏。