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

标签 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) 肯定会被释放,但是分配给全局静态指针本身的内存 (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 是一个全局的,它位于全局数据段上,与堆和栈分开。

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

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

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

这里有很多值得收集的东西! static 一开始可能会令人困惑,但对它有很好的了解会大有帮助。

关于c++ - 在 C++ 中删除其类的实例后,是否释放了分配给 cpp 中定义的全局静态变量的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020014/

相关文章:

c++ - 如何在 OS X 10.8.4 上为 iOS 模拟器 (6.1) 编译 Boost 1.54.0 (1.54)?

c++ - 将地址分配给指向指针的指针会产生段错误

c++ - 当类型包含具有给定名称和类型的静态变量时启用_if 函数

javascript - 如何在 JavaScript 中命名匿名对象?

cocoa - NSMutableArray initWithContentsOfFile 内存泄漏

c++ - 如何在 GNUMakefile 中包含 libxml2 库

php - 为什么我的 PHP 子类没有从父类获得公共(public)和 protected 变量?

Powershell 类 : property vs argument naming

memory-leaks - 根据优化级别导致内存泄漏的延迟长度字符变量

c - 在 C 中分配的指针上 malloc 安全吗?