【发布时间】:2015-07-06 11:06:53
【问题描述】:
我有一个关于 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]
【问题讨论】:
-
如果您从使用标准容器开始 - 例如
std::string、std::vector、std::set- 如果您“按值”存储元素,它们会自动为您管理和释放内存。当您必须使用指针跟踪或以其他方式处理元素时,更喜欢“智能指针”,它可以强制执行所有权/生命周期模型并避免泄漏:特别是 C++11 标准库提供了std::unique_ptr和std::shared_ptr,它们非常有用.
标签: c++ memory-management