new/deletemalloc/free的区别


  • 扩容操作:

对于malloc是有一个realloc函数对应用于扩容的;

对于new,只能再new一个,for循环赋值过去,把原来的delete掉;

  • 对于 对象:

malloc只进行空间的申请,不调用构造函数初始化对象。free也不会调用析构函数。

这段代码什么也不会输出。

#include <iostream>
using namespace std; class A {
public:
int x;
A() {
x = ;
cout << "constructor." << endl;
}
~A() {
cout << "destructor." << endl;
}
};
int main() {
A *a = (A *)malloc(sizeof(A));
free(a);
return ;
}

使用new操作符的三个步骤:

  1. 调用operator new() 函数 分配用于存储 相应对象  指定大小的 内存空间。
  2. 调用 构造函数
  3. 返回指向该对象的指针(malloc返回的是void *指针)。

使用delete操作符的两个步骤:

  1. 调用 析构函数
  2. 调用operator delete() 函数释放内存空间。

    PS:上次用C++写单链表,还因为 1 出了错,X_X。

        ~LNode() {
    LNode *p = this->next;
    while (p) {
    LNode *t = p->next;
    delete p;
    p = t;
    }
    }
  • new/delete可以进行重载

C++对new/delete函数进行了很多类型的重载,通常底层是用malloc/free来实现的。


其他还有一些我们已经当成习惯的区别:

  • 在处理数组时,free(array); delete[] array;
  • 内存分配失败,new会抛出异常,malloc会返回NULL,所以一般用malloc后面都会加 if ( ..... == NULL )
  • 一个是C语言的库函数,需要#include<malloc.h>;一个是关键字。
  • 对于C语言程序(*.c文件),只能使用malloc/free。
  • 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。

此外还有一些

    node* n1 = (node*)malloc(sizeof(node));//只会分配内存空间
//对于下面两个,如果没重写了默认构造函数,则它们是没有区别的
//如果没有自己重写默认构造函数(当然也没有写构造函数),则new node只是分配内存空间,new node()会调用默认构造函数
node* n2 = new node;
node* n3 = new node();

最新文章

  1. Go语言异常处理defer\panic\recover
  2. sqlalchemy中文乱码问题解决方案
  3. SQL Server 使用游标更新数据库中的数据(使用存储过程)
  4. Android中常用的五种数据存储方式
  5. git -- 如何撤销本地工作目录的修改
  6. 一、HTML和CSS基础--HTML+CSS基础课程--第3部分
  7. Mono 之 Jexus
  8. Andriod中绘(画)图----Canvas的使用详解
  9. Integer自动装箱分析
  10. uva 10739
  11. css变形几大属性
  12. IOS 用drawRect 画表格
  13. Git常用命令使用大全
  14. python基础3、4---流程控制、运算符
  15. python面向对象(封装、继承、多态)+ 面向对象小栗子
  16. 1. vim 的安装及配置
  17. vs2017使用rdlc实现批量打印
  18. 利用广播实现ip拨号——示例
  19. UI基础:UIScrollView、UIPageControl
  20. 【题解】Catering World Finals 2015 上下界费用流

热门文章

  1. MvcForum作者称该项目进入缓慢更新
  2. .NET开源工作流RoadFlow-流程设计-流程步骤设置-事件设置
  3. Android解析ClassLoader(一)Java中的ClassLoader
  4. 轻松应对IDC机房带宽突然暴涨问题
  5. 找工作笔试面试那些事儿(13)---操作系统常考知识点总结 ZZ 【操作系统】
  6. Windows下Git服务端和客户端的搭建
  7. 在 Windows 容器中使用 gMSA
  8. Java学习---TCP Socket的学习
  9. HTML学习---HTML状态码
  10. Nginx学习---Nginx的详解_【all】