malloc,free是一种库函数,不能被重载,new和delete是运算符,可以被重载
new和delete内部都调用malloc和free函数

new的三种用法:
1.new,不可以被重载直接new一个对象T* ptr = new T();new一个对象时做了两件事情
* 调用了operator new申请空间
* 调用了构造函数,如果括号中为空,会调用默认构造函数2.operator new,可以被重载重载形式:必须为void* operator new(size_t n, . . .); 行为类似于malloc,就是申请一段空间重载后new一个对象会调用这个函数3.placement new原地构造一个对象,相当于显示调用构造函数new (T*) T(args);
使用方式如下:A *pointer = (A*)malloc(sizeof(A));new(pointer)A(10);cout << pointer->i << endl;

delete:类似于new
会首先调用析构函数析构,然后调用free()释放空间
可以被重载,重载形式如下:void operator delete(void* ptr, . . .);

new[]:
首先调用operator new[]申请n段连续的T空间,然后会调用n次默认构造函数,可以被重载
重载形式如下:void* operator new[](size_t n, . . .);
如果重载了此函数,new[]会调用这个函数

delete[]:
与new[]配套使用,会先调用n次析构函数,然后再释放空间,可以被重载
重载形式如下:void operator delete[](void* ptr, . . .);
如果重载了此函数,delete[]会调用这个函数。

测试代码:#include <iostream>
using namespace std;
class A
{
public:A()      : i(1) { cout << "A default constructor" << endl; }A(int j) : i(j) { cout << "A constructor"        << endl; }~A()            { cout << "A destructor"          << endl; }int i;
};class B
{
public:B()      : i(1) { cout << "B default constructor" << endl; }B(int j) : i(j) { cout << "B constructor"        << endl; }~B()            { cout << "B destructor"          << endl; }void* operator new(size_t n){cout << "B my new" << endl;B* p = (B*)malloc(n);return p;}void* operator new[](size_t n){cout << "B my new[]" << endl;B* p = (B*)malloc(n * sizeof(B));return p;}void operator delete(void* ptr){cout << "B my delete" << endl;free(ptr);}void operator delete[](void* ptr){cout << "B my delete[]" << endl;free(ptr);}int i;
};int main()
{//---------------------------A---------------------------//
    A *ptr_A_1 = new A;cout << ptr_A_1->i << endl;delete ptr_A_1;cout << endl;A *ptr_A_2 = new A();cout << ptr_A_2->i << endl;delete ptr_A_2;cout << endl;A *ptr_A_3 = new A(2);cout << ptr_A_3->i << endl;delete ptr_A_3;cout << endl;A *ptr_A_4 = new A[3];auto p = ptr_A_4;for(int i = 0; i < 3; ++i) cout << (p + i)->i << " ";cout << endl;delete[] ptr_A_4;cout << endl;//------------------------B-------------------------//
    B *ptr_B_1 = new B;cout << ptr_B_1->i << endl;delete ptr_B_1;cout << endl;B *ptr_B_2 = new B();cout << ptr_B_2->i << endl;delete ptr_B_2;cout << endl;B *ptr_B_3 = new B(2);cout << ptr_B_3->i << endl;delete ptr_B_3;cout << endl;B *ptr_B_4 = new B[3];auto p1 = ptr_B_4;for(int i = 0; i < 3; ++i) cout << (p1 + i)->i << " ";cout << endl;delete[] ptr_B_4;cout << endl;return 0;
}

转载于:https://www.cnblogs.com/CoderZSL/p/8056656.html

malloc与new,free与delete相关推荐

  1. 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现

    内存分布 一.C语言中的动态内存管理方式:malloc/calloc/realloc和free 1.malloc: 从堆上获得指定字节的内存空间,函数声明:void *malloc (int n); ...

  2. 有了malloc/free为什么还要new/delete ?

    有了malloc/free为什么还要new/delete ? malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 对于非内部 ...

  3. C++中有了malloc/free 为什么还要new/delete?

    malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符.它们都可用于申请动态内存和释放内存. 对于非内部数据类型(内部数据类型是编译器本来就认识的,不需要用户 ...

  4. new/delete与malloc/free的区别与联系详解

    本博客主要说明new/delete,malloc/free的区别与联系,如下: 1.malloc/free为C的标准库函数,函数原型为: void* malloc(size_t size)//参数代表 ...

  5. 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?

    目录 一.内存分配模型 1.1 先看内存的分布状况 1.2 动态内存分配 1.3 C语言中分配内存的方式 1.4 C++中动态分配内存的方式 二.new和malloc的区别 2.1 属性 2.2 参数 ...

  6. 动态内存管理:malloc和free以及new和delete的联系与区别

    动态内存管理:malloc和free以及new和delete的联系与区别 文章目录 动态内存管理:malloc和free以及new和delete的联系与区别 一. C/C++中程序内存区域划分: 二. ...

  7. C++自学21:动态分配内存(malloc/calloc/realloc/new)/回收内存(free/delete)

    一:malloc函数,请求系统分配内存 // 让系统分配8个字节的内存,这8个字节是连续的,就是一个数组 int* a=(int*)malloc(8); // 如果分配成功,则返回数组首字节的地址,分 ...

  8. 编程中new[]和delete[]应该如何使用?

    在平时资料中,我们常看到:new和delete,new[]和delete[]一定要配对使用!有时候不配对使用也不会出现问题.也许你也是只知其然,不知其所以然,然而我也有点懵了. 在平时资料中,我们常看 ...

  9. 在什么情况下我应该使用malloc和/或new?

    我看到在C ++中有多种分配和释放数据的方法,并且我了解,当您调用malloc您应该调用free而当您使用new运算符时,您应该与delete配对,并且将两者混用是错误的(例如,调用free()在使用 ...

  10. 转载:malloc()与new()的区别详解

    1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_byt ...

最新文章

  1. php soap自动wsdl,在使用PHP的本机SOAP类时生成WSDL?
  2. C++union 联合
  3. 开发、测试与QA的区别以及其他
  4. 后端开发者开发前端必会的工具(一):样式调试篇
  5. [HNOI2016] 序列(线段树 + 莫队 + 倍增)
  6. 前端学习(2165):vuecli3配置文件的修改和查看
  7. 了不起的女子力:美妆消费蓝海与趋势赛道
  8. c 语言 00字符串 截断,c语言截断字符串
  9. xtrabackup-增量备份
  10. 用PHP做服务器接口客户端用http协议POST访问安全性一般怎么做
  11. 管理感悟:如何处理不干活的主管
  12. 【高效工作】Sublime Text 3 美化
  13. 插件:Could not find library corresponding to plugin……
  14. 电子书资源 Kindle PDF
  15. 前端实现图片快速反转替换_在canvas上实现元素图片镜像翻转动画效果的方法
  16. Python实战案例:金庸的功夫流派、人物关系的分析案例(上)
  17. 马自达推出首个混合动力车型
  18. 云计算的基本特征,主要有哪些?
  19. 74HC595/四位按键 驱动四位数码管
  20. ePower入门-TLE9879连接不上JLink

热门文章

  1. GDCM:gdcm::Spacing的测试程序
  2. GDCM:串联/提取DICOM文件的测试程序
  3. ITK:应用SIN图像过滤器
  4. ITK:平移一个网格
  5. ITK:复制非复合转换NonCompositeTransform
  6. VTK:小部件之ImplicitPlaneWidget2
  7. VTK:PolyData之ColoredPoints
  8. VTK:图片之FillWindow
  9. OpenGL Gamma Correction伽马校正的实例
  10. C++ Opengl纹理混合源码