跳转至

内存分配

堆和栈

C++堆栈详解

一个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区别

细说new与malloc的10点区别

  1. malloc/free从堆上分配内存,new/delete从自由存储区分配内存,一般new/delete的实现就是在堆上分配,但也可以通过重载来自由分配,例如在静态区
  2. 返回类型,new分配成功时返回的是对象类型的指针,而malloc返回的是void*,需要通过强制转换来转换成需要的类型
  3. malloc分配失败会返回NULL,new则会抛出异常
  4. 是否需要指定大小,new不需要,编译器会自行计算,malloc需要
  5. 是否调用构造/析构函数,new会调用构造,delete会调用析构函数,malloc则不会
  6. new可以重载,malloc不可以
  7. new/delete是C++的运算符,malloc/free是C/C++的标准库函数