如果我忘记在 C++ 中释放内存会发生什么
What happens if I forget to deallocate memory in C++
我对 C++ 中的内存管理有疑问。据我所知,不需要在 Java 中释放内存,因为 JVM 垃圾收集器有时会删除未使用的对象。我的意思是,如果我在C++中忘记释放内存,使用的内存地址将被占用,直到我重新启动机器并且内存中的数据丢失?例如,在下面的代码中,我有一个简单的链表,您可以观察到我没有释放内存(在析构函数中注释):
#include <iostream>
using namespace std;
typedef struct Node{
Node* next;
int id;
} *ListPtr;
class LinkedList{
public:`ListPtr header;
LinkedList(){
header = NULL;
}
~LinkedList(){
/*
ListPtr a = header,b;
while(a != NULL)
{
b = a;
a = a -> next;
delete b;
}
delete a,b;
cout << "Memory freed!"<< endl;
*/
}
public: void Insert(){
ListPtr new_element = new Node;
new_element -> next = NULL;
if(header == NULL){
header = new_element;
header -> id = 0;
}
else{
new_element -> next = header;
new_element -> id = header -> id + 1;
header = new_element;
}
}
public: void Print(){
ListPtr curr = header;
while(curr != NULL){
cout << "[" << &curr -> id << "]" << "-->";
curr = curr -> next;
}
cout << "[NULL]"<<endl;
}};
int main(){
LinkedList list;
list.Insert();
list.Insert();
list.Insert();
list.Insert();
list.Insert();
list.Print();
return 0;
}
是不是那些内存地址会被占用,直到我关机?程序执行完成后,诸如整数之类的变量会发生什么?我可以释放他们吗?
程序的输出是:
[0x8622ac]-->[0x86229c]-->[0x86228c]-->[0x86227c]-->[0x8615bc]-->[NULL]
这取决于操作系统。大多数现代操作系统都会跟踪每个进程分配的内存,因此当进程退出时,应该释放进程分配的所有内存。
但是,使用完后不释放资源会导致内存泄漏,在内存的情况下,您将有内存泄漏.对于长 运行 进程,这些泄漏会累积,直到所有资源都用完。
即使在进程终止时自动释放内存和其他资源,在退出进程之前显式释放分配的资源通常仍然被认为是一种好的方式。
C++ 没有像 Java 这样的垃圾收集器,程序员有责任释放动态分配的内存。操作系统会在应用程序终止时清除为应用程序分配的内存,但在某些特定情况下,必须由程序员执行释放,否则会导致内存泄漏。
#include <iostream>
using namespace std;
class test {
public:
int cl;
};
int main()
{
test *p;
p=new(test);
p->cl=5;
return 0;
}
当上述程序终止时,它将释放指针 p 但不会释放 p 指向的整数,尽管该整数不再可访问。
除非您使用某种精简的实时操作系统,否则系统在进程退出时无法恢复所有内存的可能性极小。
也就是说,不要指望这种行为是一种很好的做法。例如,您可以在 constructors/destructors 中包含已分配对象的计数。如果在程序退出之前它们都归零,则可以很好地检查内存泄漏。如果这些计数不为零,则表明某处存在内存泄漏。
我对 C++ 中的内存管理有疑问。据我所知,不需要在 Java 中释放内存,因为 JVM 垃圾收集器有时会删除未使用的对象。我的意思是,如果我在C++中忘记释放内存,使用的内存地址将被占用,直到我重新启动机器并且内存中的数据丢失?例如,在下面的代码中,我有一个简单的链表,您可以观察到我没有释放内存(在析构函数中注释):
#include <iostream>
using namespace std;
typedef struct Node{
Node* next;
int id;
} *ListPtr;
class LinkedList{
public:`ListPtr header;
LinkedList(){
header = NULL;
}
~LinkedList(){
/*
ListPtr a = header,b;
while(a != NULL)
{
b = a;
a = a -> next;
delete b;
}
delete a,b;
cout << "Memory freed!"<< endl;
*/
}
public: void Insert(){
ListPtr new_element = new Node;
new_element -> next = NULL;
if(header == NULL){
header = new_element;
header -> id = 0;
}
else{
new_element -> next = header;
new_element -> id = header -> id + 1;
header = new_element;
}
}
public: void Print(){
ListPtr curr = header;
while(curr != NULL){
cout << "[" << &curr -> id << "]" << "-->";
curr = curr -> next;
}
cout << "[NULL]"<<endl;
}};
int main(){
LinkedList list;
list.Insert();
list.Insert();
list.Insert();
list.Insert();
list.Insert();
list.Print();
return 0;
}
是不是那些内存地址会被占用,直到我关机?程序执行完成后,诸如整数之类的变量会发生什么?我可以释放他们吗?
程序的输出是: [0x8622ac]-->[0x86229c]-->[0x86228c]-->[0x86227c]-->[0x8615bc]-->[NULL]
这取决于操作系统。大多数现代操作系统都会跟踪每个进程分配的内存,因此当进程退出时,应该释放进程分配的所有内存。
但是,使用完后不释放资源会导致内存泄漏,在内存的情况下,您将有内存泄漏.对于长 运行 进程,这些泄漏会累积,直到所有资源都用完。
即使在进程终止时自动释放内存和其他资源,在退出进程之前显式释放分配的资源通常仍然被认为是一种好的方式。
C++ 没有像 Java 这样的垃圾收集器,程序员有责任释放动态分配的内存。操作系统会在应用程序终止时清除为应用程序分配的内存,但在某些特定情况下,必须由程序员执行释放,否则会导致内存泄漏。
#include <iostream>
using namespace std;
class test {
public:
int cl;
};
int main()
{
test *p;
p=new(test);
p->cl=5;
return 0;
}
当上述程序终止时,它将释放指针 p 但不会释放 p 指向的整数,尽管该整数不再可访问。
除非您使用某种精简的实时操作系统,否则系统在进程退出时无法恢复所有内存的可能性极小。
也就是说,不要指望这种行为是一种很好的做法。例如,您可以在 constructors/destructors 中包含已分配对象的计数。如果在程序退出之前它们都归零,则可以很好地检查内存泄漏。如果这些计数不为零,则表明某处存在内存泄漏。