C++ new和delete 的用法

new与delete是C++预定的操作符,它们一般需要配套使用。new用于从堆内存申请一块空间,一般动态用于动态申请内存空间,即根据程序需要,申请一定长度的空间,而delete则是将new申请的空间释放。
1.new的使用

使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值。


 一般使用格式:

      格式1:指针变量名=new 类型标识符; 例如: int  * p1=newint;

      格式2:指针变量名=new 类型标识符(初始值);例如:int  *p2=new int(2);//*p2初始化值是2

      格式3:指针变量名=new 类型标识符 [内存单元个数]; 例如:  int *p3=new int[1000] //申请1000个单位内存空间

格式1和格式2都是申请分配某一数据类型所占字节数的内存空间;但是格式2在内存分配成功后,同时将一初值存放到该内存单元中;而格式3可同时分配若干个内存单元,相当于形成一个动态数组。


2.new和malloc的区别

1. new是运算符 malloc是函数

2. new基于类型 malloc基于字节

3. New自动调用构造函数 同时初始化内存   malloc不行

New 申请内存失败会抛出异常 malloc申请内存失败会返回NULL


3.delete的使用

  释放一个数组时,  delete [ ]指向该数组的指针变量名;
   两式中的方括号是非常重要的,两者必须配对使用,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。
    delete[]的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。
2.int*p=new int(0);
  delete p;
注意这时释放了p所指的目标的内存空间,也就是撤销了该目标,称动态内存释放(dynamic memory deallocation),但指针p本身并没有撤销,该指针所占内存空间并未释放,当堆上内存释放后,p成为野指针,所以一般在delete 指针之后 要将指针置空。
例如:
1. 删除单变量地址空间

      int *a = new int;

      delete a;   //释放单个int的空间

2. 删除数组空间

      int *a = new int[5];

      delete []a;   //释放int数组空间
4.注意事项
1. new和delete都是内建的操作符,语言本身所固定了,无法重新定制,想要定制new和delete的行为,徒劳无功的行为。

2. 动态分配失败,则返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败,还有一种办法是 失败后 抛出异常。

3. 指针删除与堆空间释放。删除一个指针p(deletep;)实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身(指针p本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放),释放堆空间后,p成了空指针。

4. 内存泄漏(memory leak)和重复释放。new与delete 是配对使用的,delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。

5. 动态分配的变量或对象的生命期。我们也称堆空间为自由空间(freestore),但必须记住释放该对象所占堆空间,并只能释放一次,在函数内建立,而在函数外释放,往往会出错。

6. 要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问。

   用new和delete可以动态开辟和撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数据),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值