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字节空间。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论