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是否可以相互调用
-
申请的内存所在位置
-
内存分配失败时的返回值
-
是否需要指定内存大小
-
对数组的处理
-
客户处理内存分配不足
-
能够直观地重新分配内存