C++深入讲解new与deleted关键字的使用

 更新时间:2022年05月21日 09:48:28   作者:Mi ronin  
这篇文章主要介绍了C++中new与deleted关键字的使用,new在动态内存中为对象分配空间并返回一个指向该对象的指针;delete接受一个动态对象的指针, 销毁该对象, 并释放与之关联的内存

可执行程序的虚拟地址空间

  1. 内核:存放操作系统
  2. 栈区:函数的形参,非静态的局部变量,函数现场 保护数据等等,栈是向下增长的。
  3. 共享库的内存映射区域:用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。
  4. 堆区:用于程序运行时动态内存分配,堆是可以上增长的。
  5. 数据:存储全局数据和静态数据,分为.bss和.data 。
  6. 代码:可执行的程序(机器指令)和常量数据。

1.new的运算符用法(关键字)

int* p= new int(10);

这里的new的用法是当作运算符的用法,该用法一共有四个步骤:

  1. 计算类型
  2. 申请一个空间(因为new的底层是malloc)
  3. 将所取得的空间初始化
  4. 将申请到的地址返回

2.new的函数用法

new当作函数用法使用的是时候,类似malloc,都是申请一个空间,区别在于,返回值不同;当空间不足时malloc会返回一个“nullptr”,operator new会返回一个throw_bad的异常。

当我们加入一个nothrow后:

这样申请错误后,我们返回的是空指针。

对于malloc我们不可以进行初始化,new也不可以初始化。

所以当new作为函数时就相当于malloc。

3.定位new

定位new用法与构造new十分相似,是在已经确定的空间当中,构造一个对象,并将该对象放置到声明的空间当中。

int main()
{
	int n = 10;
	int* ipa = (int*)ma11oc(sizeof(int));
	int* ipb = (int*) : :operator new(sizeof(int) * n);
	new(ipa) int(20);
	new(ipb) int[]{ 1,2,3,4,5,6,7,8,9 };
	free(ipa);
	: :operator delete(ipb);
	return 0;
}

不需要开辟相应的空间 合法空间即可 给出某个地址 即可根据要求进行相应操作。

4.new创建对象

new创建对象特点:

  1. new创建对象需要指针接收,一处初始化,多处使用。
  2. new创建对象使用完需delete销毁。
  3. new创建对象直接使用堆空间,而局部不用new定义对象则使用栈空间。
  4. new对象指针用途广泛,比如作为函数返回值、函数参数等。
  5. 频繁调用场合并不适合new,就像new申请和释放内存一样。

new创建对象例子:

CTest*  pTest = new  CTest();
delete pTest;

pTest用来接收对象指针。

不用new,直接使用类定义申明:

CTest  mTest;

此种创建方式,使用完后不需要手动释放,该类析构函数会自动执行。

而new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。

C Test*  pTest = NULL;

但使用普通方式创建的类对象,在创建之初就已经分配了内存空间。

这类指针,如果未经过对象初始化,则不需要delete释放。

5.delete

delete运算符使用的一般格式为

 delete [ ]指针变量

例如要撤销上面用new开辟的空间用:

delete p; 

如果我们用“new char[10];”开辟的字符数组空间,把new返回的指针赋给了指针变量pt,则应该用以下形式的delete运算符撤销该空间:

  delete [] pt;

一般来说delete与new需要配对使用。

6.对于内置类型new/delete/malloc/free可以混用

  1. new/delete是C++中的运算符。malloc / free是函数。
  2. malloc申请内存空间时,手动计算所需大小,new只需类型名,自动计算大小;
  3. malloc申请的内存空间不会初始化,new可以初始化;
  4. malloc的返回值为void*,接收时必须强转,new不需要;
  5. malloc申请内存空间失败时,返回的是NULL,使用时必须判空;new申请内存空间失败时返回异常

7.使用注意事项

动态分配失败,则返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败。

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

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

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

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

用new和delete可以动态开辟和撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数据),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。

到此这篇关于C++深入讲解new与deleted关键字的使用的文章就介绍到这了,更多相关C++ new与deleted内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++引用传参和指针传参的区别及说明

    c++引用传参和指针传参的区别及说明

    这篇文章主要介绍了c++引用传参和指针传参的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 利用C语言实现扫雷小游戏

    利用C语言实现扫雷小游戏

    这篇文章主要为大家详细介绍了利用C语言实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • C++之set自定义排序问题

    C++之set自定义排序问题

    这篇文章主要介绍了C++之set自定义排序问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • C++求两数之和并返回下标详解

    C++求两数之和并返回下标详解

    这篇文章主要介绍了C++求两数之和并返回下标题目的代码详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++之异常处理详解

    C++之异常处理详解

    C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理
    2013-08-08
  • C语言超详细分析多进程的概念与使用

    C语言超详细分析多进程的概念与使用

    在一个项目中并发执行任务时多数情况下都会选择多线程,但有时候也会选择多进程,例如可以同时运行n个记事本编辑不同文本,由一个命令跳转到另外一个命令,或者使用不同进程进行协作
    2022-08-08
  • C/C++中组合详解及其作用介绍

    C/C++中组合详解及其作用介绍

    这篇文章主要介绍了C/C++中组合的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Windows程序内部运行机制实例详解

    Windows程序内部运行机制实例详解

    这篇文章主要介绍了Windows程序内部运行机制实例详解,对于学习Windows程序设计来说是非常重要的一课,需要的朋友可以参考下
    2014-08-08
  • VS2019实现C++的第一个MFC程序

    VS2019实现C++的第一个MFC程序

    本文主要介绍了VS2019实现C++的第一个MFC程序,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • C语言教程之数组详解

    C语言教程之数组详解

    这篇文章主要为大家介绍了C语言教程之数组,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论