new与malloc

根据网上资料整理,供自己笔记和学习交流使用。
一 malloc函数
1.1
memory allocation的简称
extern void *malloc(unsigned int num_bytes);
分配长度为num_bytes的内存块,如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。申请后必须要检查是否分配成功。

1.2
free()将malloc分配的空间还给程序或者操作系统。

二 new
2.1
new 为运算符,创建单个对象,创建时只需指定对象的类型,不必为该对象命名。它返回指向该新创建的指针,可以通过指针来访问此对象。
int *pi = new int;

2.2 动态创建对象初始化
int *p = new int(10); // 初始化为100;
int *p = new int(); // 默认初始化
int *p = new int; // 未初始化
string *s = new string(3, ‘p’); // 初始化为ppp

2.3 撤销动态创建的对象
delete表示释放指针指向的地址空间
delete p; //释放单个对象
delete []p; //释放数组

!!delete后p所变成了不确定的指针,尽管p没有明确的定义但是它仍然存放之前所指的对象地址,然而由于p指向的地址不再有效所以p变成了悬垂指针,此类指针往往会导致程序错误且很难发现。

三 区别
3.1 malloc是一个标准库函数,而new是c++的一个运算符。
3.2 返回的指针类型不一样
malloc返回的是无类型指针,需要强行转换为实际类型的指针。new返回指定类型的指针。

3.3 malloc 则必须要由我们计算字节数。而new可以自动计算所需要大小
int *p = new int(); //分配的大小为sizeof(int)
int q = (int )malloc(sizeof(int)*128) //分配128个整型的存储单元并将这128个连续的整型存储单元的首地址存储到指针变量p中

3.4 初始化不一样
malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
new不止分配内存还可以调用类的构造函数,同理delete会调用类的析构函数。new还可以默认初始化也可以显示的初始化

3.5 内存获取的位置不一样
malloc从堆里面获得的空间,返回的指针是指向堆里的一块内存。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
new是在分配在什么地方???有待研究,欢迎哪位知道的给我留言,谢谢。

3.6 他们的字符个数不一样
new三个字母,malloc有六个字母

四 为什么有了malloc/free还需要new/delete?
因为malloc/free无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,对象在创建的同时要自动执行构造函数,对象在消亡后要自动执行析构函数。由于malloc/free是库函数所以他们不在编译控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free上面,所以需要有一个能够完成动态分配和初始化工作的new,和一个能够完成清理与释放内存工作的delete。

五 为什么有了new/delete还需要malloc/free?
因为c++程序经常需要调用c的函数,而c程序只能用malloc/free来管理动态的内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值