new/delete和malloc/free用法与区别

1 new / delete

1.1 new/delete表达式(操作符)

表达式的使用如下:

string *sp=new string("aaaa");
string *arr=new string[10];
delete sp;
delete [] arr;

以上的new表达式(操作符)在使用时共经历了三步:分配内存、构造(初始化)对象、返回指针。

以上的delete表达式(操作符)在使用时共经历了两步:析构对象、释放内存。

1.2 operator new/operator delete [ ]函数

  • operator new(或operator new[ ])函数一般只执行new操作符的第一步——分配内存。对operator new/delete函数的重载也能待变内存分配和释放的方式,不能改变new/delete运算符的含义。
  • opeartor new /operator delete可以被重载。标准库是定义了operator new函数和operator delete函数的8个重载版本:
//这些版本可能抛出异常
void * operatornew(size_t);
void * operator new[](size_t);
void * operatordelete (void * )noexcept;
void * operator delete[](void *0)noexcept;
//这些版本承诺不抛出异常
void * operatornew(size_t ,nothrow_t&) noexcept;
void * operator new[](size_t, nothrow_t& );
void * operatordelete (void *,nothrow_t& )noexcept;
void * operator delete[](void *0,nothrow_t& )noexcept;

重载operator new 和 operator delete的一种简单方式:

void * operator new(size_t size) //第一个形参必须是size_t,由编译器计算
{
	if(void *mem=malloc(size))  //用malloc分配空间要检查指针
		return mem;            //返回 void *
	else
		throw bad_alloc();    //抛出异常
}

void operator delete(void *mem) noexcept
{
	free(mem);
}
  • 定位new表示式允许用户向new表示式传递额外的参数。
int *p=new (nothrow)int; //不抛出异常,如果分配失败,new返回一个空指针。
  • 当只传入一个指针类型的实参时,定位new使用operator new(size_t, void *)在传入的地址上构建对象但是不分配内存。传给定位new的指针无须指向operator new分配的内存,也不需要指向动态内存。

2.malloc / free

2.1 malloc

原型:extern void *malloc(unsigned int num_bytes); 

说明:malloc的全称是memory allocation,中文叫动态内存分配。分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL(0)。当内存不再使用时,应使用free()函数将内存块释放。

2.2 free

原型:void free(void *FirstByte);

 说明:该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由

3.区别

参考网址:https://www.linuxidc.com/Linux/2016-01/127591.htm

  • 是否可以被重载

  • 是否调用构造函数/析构函数

  • new与malloc是否可以相互调用

  • 申请的内存所在位置

  • 内存分配失败时的返回值

  • 是否需要指定内存大小

  • 对数组的处理  

  • 客户处理内存分配不足

  • 能够直观地重新分配内存

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值