想象一下你有一个房子,房子里有很多房间,每个房间都可以用来存放东西。在C++中,内存管理就像是你在设计和建造这个房子。你可以自己决定房间的数量和大小,也可以随时动态地改变它们。但是,你需要小心地管理这些房间,确保你不会浪费空间或者让房间里的东西互相干扰。所以,C++中的内存管理就是你在思考如何合理利用和组织这些房间,确保你的程序可以高效地运行。
c++内存分为五个区:栈,堆,自由存储区,全局(静态)存储区,常量存储区
栈
- 局部作用域中的局部变量、函数参数以及函数调用的返回地址等信息在堆中创建,栈的大小是在程序开始运行时(或线程创建时)确定的,通常是一个固定的值。一旦函数返回或局部变量超出其作用域时,栈上的内存会自动被释放。
- 栈是由系统提供的结构,计算机会在底层对栈提供支持,所以栈的效率会比较高
#include <iostream>
using namespace std;
void functionOnStack() {
int stackVariable = 42; // 局部变量,存储在栈上
cout << "Stack variable: " << stackVariable << endl;
// stackVariable 在这里离开作用域,其内存自动释放
}
int main() {
functionOnStack(); // 调用函数,局部变量在栈上分配和释放
return 0;
}
堆
存储动态分配的对象,用new/malloc分配,delete/free释放。这种分配方式允许程序在运行时根据需要分配任意数量的内存,并且这些对象的存在时间不受其作用域的限制,只要程序不主动释放它们(使用 delete
运算符或 free
函数),它们就会一直占用内存。
栈和堆的区别请看c++中的堆和栈-CSDN博客
new/malloc和delete/free的区别请看:c++中既然有了malloc/free为什么还要有new/delete呢-CSDN博客
#include <iostream>
using namespace std;
int* createHeapVariable() {
int* heapVariable = new int(42); // 在堆上动态分配内存
return heapVariable; // 返回指针,允许在函数外部访问堆上的变量
}
int main() {
int* ptr = createHeapVariable(); // 调用函数,获取堆上变量的指针
std::cout << "Heap variable: " << *ptr << endl;
delete ptr; // 手动释放堆上分配的内存
return 0;
}
自由存储区
由new申请的内存就是自由存储区(在C++标准中,“堆”这个术语并没有明确定义为一个具体的内存区域,而是更多地用于描述一种动态内存管理机制。而“自由存储区”则是C++标准明确提到的一个概念,它是指通过new
分配和delete
释放的内存区域。因此,虽然“自由存储区”和“堆”在严格意义上可能不完全等同,但在日常编程和讨论中,它们通常被视为同一概念,指的是用于动态内存分配的区域。)
全局(静态)存储区
存储全局变量、静态变量(包括静态局部变量和静态类成员)以及常量字符串,内存在编译期间就已经分配好,在程序运行阶段一直存在。
#include <iostream>
using namespace std;
int globalVariable = 100; // 全局变量,存储在全局/静态存储区
void functionWithStaticVariable() {
static int staticVariable = 200; // 静态局部变量,也存储在全局/静态存储区
cout << "Static variable: " << staticVariable << endl;
}
int main() {
cout << "Global variable: " << globalVariable << endl;
functionWithStaticVariable(); // 调用函数,静态变量在全局/静态存储区分配和保留
// 全局变量和静态变量在程序结束时自动释放
return 0;
}
常量存储区
常量存储区并不是一个独立的内存区域,而是通常包含在全局/静态存储区中。但为了解释方便,我们可以将其视为一个单独的类别。
- 存储常量,如
const
修饰的变量和字符串常量。 - 常量在程序运行期间不能被修改。字符串常量通常存储在只读数据段中,以防止被意外修改。
#include <iostream>
using namesace std;
const int constVariable = 300; // const 变量,可能存储在常量存储区或全局/静态存储区
int main() {
const char* stringConstant = "Hello, World!"; // 字符串常量,存储在常量存储区
cout << "Const variable: " << constVariable << endl;
cout << "String constant: " << stringConstant << endl;
// constVariable 和 stringConstant 的值在程序执行期间不会改变
return 0;
}
总结
- 栈:临时存储,自动管理。
- 堆(自由存储区):动态存储,需要显式管理。
- 全局/静态:贯穿程序生命周期,自动管理。
- 常量:存储常量数据,通常包含在全局/静态存储区中,只读。