内存分配
堆和栈¶
一个C/C++编译的程序占用的内存分以下几部分
- 栈: 编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等
- 堆: 一般由程序员分配释放,分配方式类似于链表
- 全局区(静态区): 存放全局变量、静态变量
- 文字常量区: 常量字符串等存放在这里
- 代码区: 存放函数的二进制代码
nt a = 0; // 全局初始化区
char *p1; // 全局未初始化区
int main() {
int b; // 栈
char s[] = "abc"; // 栈
char *p2; // 栈
char *p3 = "123456"; //123456//0 在常量区, p3 在栈上。
static int c =0; // 全局(静态)初始化区
p1 = new char[10]; // 堆
p2 = new char[20]; // 堆
strcpy(p1, "123456"); //123456 放在常量区,编译器可能会将它与 p3 所指向的 "123456" 优化成一个地方
}
malloc和new区别
- malloc/free从堆上分配内存,new/delete从自由存储区分配内存,一般new/delete的实现就是在堆上分配,但也可以通过重载来自由分配,例如在静态区
- 返回类型,new分配成功时返回的是对象类型的指针,而malloc返回的是void*,需要通过强制转换来转换成需要的类型
- malloc分配失败会返回NULL,new则会抛出异常
- 是否需要指定大小,new不需要,编译器会自行计算,malloc需要
- 是否调用构造/析构函数,new会调用构造,delete会调用析构函数,malloc则不会
- new可以重载,malloc不可以
- new/delete是C++的运算符,malloc/free是C/C++的标准库函数