一、C的动态内存管理
malloc、calloc、realloc
int main()
{
int n=10;
//void* malloc(size_t size);分配size字节的未初始化内存
int *ipa = (int*)malloc(sizeof(int)*n);
//void *calloc(size_t num,size_t size);
//为num个size大小的对象的数组分配内存,并将分配存储中的所有字节初始化为零
int *ipb =(int*)calloc(n,sizeof(int));
//void *realloc(void *ptr,size_t new_size);
//重新分配给定的内存区域(扩容)
ipa=(int *)realloc(ipa,szieof(int)*n*2);
free(ipa);//释放都使用free
ipa=NULL;
free(ipb);
ipb=NULL;
return 0;
}
二、c++的动态内存管理
1.new运算符的使用
new首先开辟内存空间,其次调动缺省构造函数。
int main()
{
int n=10;
// 1.计算sizeof(int) 2.malloc 3.初始化为10 4.将申请的空间给ipa
int *ipa=new int(10); //int *ipa=10;
// 1.计算sizeof(int)*n 2.malloc 3.将第一个初始化为10,其余为0 4.申请的空间给ipb
int *ipb=new int[n](10);
int *ipc=new int[n]{1,2,3,4,5,6,7};
delete ipa;//注意:free和delete之后,必须将指针置空
delete[]ipb;
delete[]ipc;
reeturn 0;
//用new申请之后,释放用delete
}
2.new的函数方式的使用
int main()
{
int n=10;
//以函数形式调用new,只是申请空间,不进行初始化
int *ipa=(int*)::operator new(sizeof(int));
// (int*)malloc(szieof(int)) 内存不足时,申请失败,返回空
int *ipb=(int*)::operator new(sizeof(int)*n);
// (int*)malloc(sizeof(int)*n);
::operator delete(ipa);
::operator delete(ipb);
return 0;
}
new和operator new在内存不足时,申请失败,抛出异常,(std::bad_alloc)
对于new来说判空无意义,而malloc有意义
int *ipa=new(std::nothrow)int(10);//不要抛出异常,申请失败为0
三、定位new
int main()
{
int n=10;
int *ipa=(int*)malloc(sizeof(int));
int *ipb=(int*)::operator new(sizeof(int)*n);
new(ipa) int(20); //new(ipa) int{20}两种写法等价
new(ipb) int[]{1,2,3,4,5,6,7,8,9};
free(ipa);
::operator delete(ipb);
return 0;
}
定位new只要有合法的空间,就可以将任意类型给进去
四、new、malloc区别
1.new/delete是c++中的运算符。malloc/free是函数api;
2.malloc申请内存空间时,手动计算所需大小,new只需类型名,自动计算大小;
3.malloc申请的内存空间不会初始化,new可以初始化;
4.malloc的返回值为void*,接收时必须强转,new不需要;
5.malloc申请内存空间失败时,返回的是NULL,使用时必须判空;
6.new申请内存空间失败时抛出异常,所以要有捕获异常处理程序;
五、free和delete的区别
free对应的是malloc,delete对应的是new,free用来释放malloc的对应内存空间,delete释放的是new的对应内存空间。
在对象中, free的确释放了对象的内存,但是不调用对象的析构函数,所以如果在对象中使用new分配的内存就会泄露, delete不仅释放对象的内存,并且调用对象的析构函数!