2020, Aug,10 new与delete

new与delete

  1. 申请内存
  • 回顾malloc/free
    注意:malloc申请而来的只是内存,严格地说不是"对象"

    // 4个int, 16个字节
    int* p = (int*) malloc(16);
    for(int i=0; i<4; i++) {
        p[i] = i;
    }
    free(p);
    
  1. 创建对象
  • 在C++中,用new/delete操作符取代malloc/free
// 申请一个对象:
int* p = new int;
// 释放
delete p;
  • 注意:

    1. new的返回值直接就是对象指针,不用再转换
    2. new的时候可以设初始值 new int(12)
  • 申请多个对象

    // 申请1024个对象
    int* p = new int [1024];
    for(int i =0; i<1024; i++)
    {
        p[i] = i+1;
    }
    // 释放
    delete [] p;
    
  • 注意:

    1. 用[]指定对象个数
    2. 如果new的时候用了[],则释放的时候使用delete []操作符
    // 申请一个Student对象
    Student* s = new Student;
    s->id = 12;
    strcpy(s->name, "shaofa");
    
    // 用完之后,释放
    delete s;
    
    // 申请500个Student
    Student* st = new Student[500];
    for(int i =0; i<500; i++)
    {
        s[i].id = i+1;
    }
    
  1. 使用原则
  • 使用原则与malloc/free类似,都是向内存管理器MM来s申请内存。
    1. 用new申请的内存,必须用delete释放
    2. 用new []申请的内存,必须用delete []释放
    3. 用完之时,及时释放!
  1. 注意事项
  • 和free一样,delete之后指针所指向的内存不再可用
delete p;
p = NULL; // 最好置为空指针
  • 注意:释放之后,指针的值不发生改变
  1. 动态创建对象
  • 对于class类型,必须用new/delete来创建、销毁。

    malloc/free是无法胜任的

  • new动态创建了一个对象

    1. 申请一块内存
    2. 内部调用了构造函数
  • delete:释放这个对对象

    1. 调用了析构函数
    2. 释放内存
  • 动态创建一个对象

    // 默认构造函数
    Circle* c = new Circle();
    // 不加括号也可以
    Circle* c = new Circle();
    // 传构造参数
    Circle* c = new Circle(1, 1, 4);
    
    // 释放对象
    delete c;
    
  • 注意:new的时候构造函数被调用,delete的时候析构函数被调用

  • 动态创建多个对象

    Circle* c = new Circle[4];
    delete [] c;
    
  • 注意:含有“默认构造函数”的类,才可能使用new []一次性地创建多个对象

  • new与malloc的巨大区别:

    malloc返回的只是一片内存,不是对象(malloc不负责构 造)

    new返回的是一个可以正常工作的对象(因为它调用了析构函数)

    所以,new/delete绝不仅仅是申请内存这么简单,它是申请了内存,并且构造了对象

    // 虽然可以用malloc的方法强制转换成对象,但是由于没有调用默认构造函数,成员变量x,y的参数值都是乱的
    Circle* p =(Circle*)malloc(sizeof(Circle));
    
  • 小结:

    1. new得到的是一个对象,malloc得到的不是对象。因此,C++的类必须用new,不能用,malloc
    2. new一个对象的时候,可以传参,内部会调用构造函数
    3. new多个对象(数组)的时候,不能传参数,要求该类必须有默认构造函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值