【C/C++学习笔记】new、delete、malloc、free

malloc/free和new/delete的区别总结

1、new/delete是C++的操作符,是保留字,不需要头文件支持;而malloc/free是C中的标准库函数,需要头文件 stdlib.h 支持。

2、new由编译器自己计算和分配空间大小,而malloc需要开发人员指定所分配空间的大小。且malloc 申请完空间之后不会对内存进行必要的初始化,而 new 可以。

3、new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。

4、new建立的是一个对象,而malloc分配的是一块内存;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针;new出来的指针是带有对应类型信息的,而malloc返回的是void *,必须强制类型转换对应类型指针。

5、malloc开辟内存时返回内存地址要检查判空,因为若它可能开辟失败会返回NULL;new则不用判断,因为内存分配失败时,它会抛出异常bac_alloc,可以使用异常机制;

6、无论释放几个空间大小,free只传递指针;但是使用 new [] 申请的多个对象时,一定需要 delete [] 释放。例如:

malloc、free使用示例:

void main()
{  
    int *p1 = (int*)malloc(sizeof(int)); // 开辟一个空间
    if (p1 == NULL) { //判断是否内存申请成功
        exit(1);
    }
    *p1 = 0; // malloc 申请完最好需要手动初始化一下
    if (p1) {  // 释放的时候加个判断是个好习惯
        free(p1);
        p1 = NULL; //指针用完及时置空,避免因此出现野指针   
    }
    
    int *p2 = (int*)malloc(sizeof(int)*4); // 开辟多个空间 
    if (p2 == NULL) { //判断是否内存申请成功
        exit(1); 
    }
    memset(p2, 0x0, sizeof(int)*4); // malloc 申请完最好需要手动初始化一下
    if (p2) {
        free(p2);
        p2 = NULL; //指针用完及时置空,避免因此出现野指针   
    }
}
 

new、delete使用示例: 

void main()
{ 
	int *p1 = new int(0); // 开辟一个空间, 单个对象可以初始化
	delete p1; // delete 有做内部有实现空指针处理,可以不加判断
	p1 = nullptr;

	int *p2 = new int[4]; // 开辟多个空间
	memset(p2, 0x0, 4 * sizeof(4));
	delete []p2;  //
	p2 = nullptr;
}  

注意: 
 如果用new 创建对象数组,那么只能使用对象的无参数构造函数。例如:
  Obj *objects = new Obj[100];      // 正确 创建100 个动态对象
  Obj *objects = new Obj[100](0);  // 错误 创建100 个动态对象的同时赋初值1
在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如
  delete []objects;                 // 正确
  delete objects;                   // 错误 后者相当于delete objects[0],漏掉了另外99 个对象。

7、因为new/delete是操作符,它调用operator new / operator delete,它们可以被重载,在标准库里它有8个重载版本;而malloc/free不可以重载;

 

总结:

1、不管是用new还是用malloc,在进行内存分配的时候都要先检查一下是否分配到内存,即分配完了之后要赶紧检查一下返回指针是否为NULL(为NULL即分配内存失败);不管是用free还是用delete或者delete[]释放完内存之后,都要把原本的指针置空,避免出现野指针。 

2、malloc 申请的内存的释放必须对应 free,new 申请的内存的释放必须对应 delete,new[] 申请的内存的释放必须对应 delete[],要不然可能会造成内存泄露。

3、不要对直接定义的变量或者数组进行 free 或者 delete;不能free一个非malloc返回的指针,不能delete一个非new返回的指针。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值