在 C++ 中删除其 class 的实例后,是否释放了分配给 cpp 中定义的全局静态变量的内存?
Is the memory allocated to a global static variable defined in cpp freed up after a instance of its class is deleted in C++?
我有一个 class,其方法在 example.cpp 文件中定义,class 在 example.h 中定义。 example.cpp 文件中定义了一个静态全局指针。 (我需要在 .cpp 中将此指针定义为静态全局指针,因为它在裸机系统上的静态中断服务例程 运行 中被调用。)我想知道 这个实例何时出现class被删除,分配给这个静态全局指针的内存,定义在class之外(在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) 的内存也会被释放吗? (我假设)如果静态全局变量没有被class的所有实例共享,它是否实际上为这个静态全局变量分配内存但在删除实例后没有释放它?会不会导致内存泄露?
第一次在这里提问。如有不明之处敬请见谅。
任何声明为 static
的东西都存在于程序的生命周期中。它在第一次可能使用之前构造,并在程序终止期间的一个未完全指定的时刻销毁(即,在调用 main
returns 或 exit
之后)。
此外,销毁(非智能)指针永远不会销毁指针指向的东西。如果你想释放它指向的资源,你必须在指针上显式调用 delete
。 (或者使用智能指针。做。他们更好。)
一般情况下,静态全局变量不是成员变量,所以当class分配或删除时,对静态全局变量没有影响,除非class成员显式分配或为静态全局变量释放内存。
在您的示例中,您只是将指针分配给全局变量,而不是分配新内存。因此,您无需明确释放它。
此外,您不需要在main() 中调用delete,因为eg1 是局部变量。当mainreturns时,会自动调用eg1的析构函数
首先,如果您 运行 您发布的代码,您将得到以下内容:
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
指针对象没有内在link到classexample
,当然也没有内在link 到对象 eg1
。如果系统仅仅因为 eg1
超出范围就破坏了 ptr
,那么该语言将 非常 损坏。
我有一个 class,其方法在 example.cpp 文件中定义,class 在 example.h 中定义。 example.cpp 文件中定义了一个静态全局指针。 (我需要在 .cpp 中将此指针定义为静态全局指针,因为它在裸机系统上的静态中断服务例程 运行 中被调用。)我想知道 这个实例何时出现class被删除,分配给这个静态全局指针的内存,定义在class之外(在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) 的内存也会被释放吗? (我假设)如果静态全局变量没有被class的所有实例共享,它是否实际上为这个静态全局变量分配内存但在删除实例后没有释放它?会不会导致内存泄露?
第一次在这里提问。如有不明之处敬请见谅。
任何声明为 static
的东西都存在于程序的生命周期中。它在第一次可能使用之前构造,并在程序终止期间的一个未完全指定的时刻销毁(即,在调用 main
returns 或 exit
之后)。
此外,销毁(非智能)指针永远不会销毁指针指向的东西。如果你想释放它指向的资源,你必须在指针上显式调用 delete
。 (或者使用智能指针。做。他们更好。)
一般情况下,静态全局变量不是成员变量,所以当class分配或删除时,对静态全局变量没有影响,除非class成员显式分配或为静态全局变量释放内存。
在您的示例中,您只是将指针分配给全局变量,而不是分配新内存。因此,您无需明确释放它。
此外,您不需要在main() 中调用delete,因为eg1 是局部变量。当mainreturns时,会自动调用eg1的析构函数
首先,如果您 运行 您发布的代码,您将得到以下内容:
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
指针对象没有内在link到classexample
,当然也没有内在link 到对象 eg1
。如果系统仅仅因为 eg1
超出范围就破坏了 ptr
,那么该语言将 非常 损坏。