C++编程之new的用法以及其代码书写格式

首先第一句,new的作用是开辟空间并初始化,即开辟空间,调用类的构造函数。
在C++中,我们都是使用new来申请空间,delete释放空间。C语言中,我们使用的是malloc申请空间,free释放空间。二者的区别我们下面有讲。值得注意的一点是:平日里,我们声明变量所创建空间在栈或者数据段上,这些都不需要程序员手动释放,在结束时(这里的结束指的是例如在函数内部创建的局部变量,在函数调用结束后的结束),系统会自动释放。然而,程序员使用new或者是malloc创建的空间时在堆上,如果程序员不手动释放空间,内存就会出现”内存泄露”现象(内存泄露是指在程序一直运行时,不断的开辟空间而不去释放,就会导致该机器上的内存越来越少。当程序退出时,系统会自动回收那些没有释放掉的内存空间,但是注意,这是系统释放的,不是程序本人释放的。)
一般使用new的格式为:

T* ptr = new T();

事实上,new一般都是调用operator new来分配空间,如果手动重载了operator new,即A::operator new()则会调用重载的operator new,不然那就调用系统默认的operator new()。
operator new有三种方式。

(1) void* operator new (std::size_t size);
(2) void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept;
(3) void* operator new (std::size_t size, void* ptr) noexcept;

(1)分配size字节的存储空间,成功的话返回一个指针,按照内存对齐规则内存对齐,返回分配空间的第一个的地址。失败的话,会抛异常,不会调用构造函数。
(2)分配size字节的存储空间,成功的话返回一个指针,按照内存对齐规则内存对齐,返回分配空间的第一个地址。失败的话,返回NULL,不会抛异常,也不会调用构造函数。
(3)只返回ptr指针,不分配空间。这里的ptr指向已经分配好的空间。new调用对象的构造函数,ptr指向的内存只要不释放,就可以一直重复使用。所以,一般都是在内存池的实现中使用。也就是placement new版本。(了解)

malloc和new的区别
(1)malloc是函数,new是关键字
(2)malloc只能按照字节数来分配空间大小,new不仅可以按照字节数分配空间大小,也可以按照类型,对象分配空间大小。
(3)开辟失败时,malloc返回一个NULL,new抛异常。
new 的一般格式:
格式1:指针变量名=new 类型标识符;
格式2:指针变量名=new 类型标识符(初始值);
格式3:指针变量名=new 类型标识符 [内存单元个数];

(1)int* ptr1 = new int;//开辟一个存储一个整形大小的空间。ptr1指向开辟好的空间的第一个地址。
(2)int* ptr2 = new int(1);//开辟一个存储一个整形大小的空间,ptr2指向开辟好的这个空间的第一个地址,并将这个空间初始化为1。
delete ptr1;
delete ptr2;

以上是前两种开辟空间的格式以及释放空间的方式。

(3)int* ptr3 = new int[4];
delete ptr3[];

开辟数组空间,释放方式。
重要提醒:new int[4]就需要使用delete ptr3[]释放。需要配对使用。如果只是采用delete ptr3,就只会释放这个数组的第一个元素,剩下的就会造成内存泄露问题。
当我们使用new int[]申请空间时,申请到的空间操作系统会在最开始有一个4字节空间来保存后面一共开辟了几个空间。所以,释放空间时,同时需要释放掉这个4字节空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值