动态分配内存

  1. 使用new/delete申请释放内存
    • 类型名* 指针=new 类型名
      • int* p=new int;
      • delete p;
    •  类型名* 指针=new 类型名[数组长度]
      • int* ptr=new int[5];
      • delete []p;
  1. 使用malloc/free申请释放内存
    • 类型名* 指针=(类型名*)malloc(数组长度*sizeof(类型名));
    • free(p);
      • short* p=(short*)malloc(5*sizeof(short));
      • free(p);

俩者区别:

  1. 属性
    • new/delete 是c++关键字,需要编译器支持;malloc/free是库函数,需要头文件的支持。
  2. 参数
    • 使用new操作符申请内存分配时无需指定内存块的大小,编译器会根据类型信息判断。而malloc则需要显示地指出所需内存地尺寸。
  3. 返回类型
    • new操作符内存分配成功时,返回的是对象类型地指针,类型严格与对象匹配,无需进行类型转换,故new是符合类型安全性地操作符。
    • malloc内存分配成功则是void*,需要通过强制类型转换将void*指针转换成我们需要的类型。
  4. 分配失败
    • new分配失败时,会抛出bac_alloc异常;malloc分配内存失败时会返回NULL。
  5. 自定义类型
    • new会先调用operator new函数,申请足够地内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete 函数释放内存(通常底层使用free实现)。
    • malloc/free是库函数,只能动态地申请和释放内存,无法对自定义类型对象进行构造和析构工作
  6. 重载
    • 因为new/delete是操作符,他调用opertor new/operator delete,他们可以被重载,在标准库里他有8个重载版本;而malloc/free不可以被重载。
  7. 内存区域
    • malloc在堆上分配内存,但是new其实不能说是在堆上,c++中,对new申请内存位置有一个抽象概念,他为自由存储区,可以在堆上,也可以在静态存储区上分配。取决于oprator new实现细节。

 

参考自:https://blog.csdn.net/nie19940803/article/details/76358673?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

posted @ 2020-06-16 10:58  每天都要吃早饭  阅读(164)  评论(0编辑  收藏  举报