首页 > 系统相关 >【cplusplus教程翻译】动态内存

【cplusplus教程翻译】动态内存

时间:2023-05-29 10:48:14浏览次数:51  
标签:教程 int cplusplus 内存 动态内存 new foo nothrow delete

定义变量使用的内存在程序运行前就确定了,有些时候我们希望能在运行期得到内存,可以使用操作符new和delete

new和new[]

new操作符可以分配动态内存,new后面需要跟着数据类型,如果需要多个该数据类型的元素,还需加上方括号,这个操作符返回的是新分配内存的头指针,语法是pointer = new type pointer = new type [number_of_elements]
第一个表达式用来分配一个type类型元素所需要的内存,第二句话用来分配一组元素,注意number_of_elements可以是变量,操作符的输入

int * foo;
foo = new int [5];

注意返回值是指针类型
注意声明正常数组和new数组有很大的不同,最大的区别就是正常数组的大小是常量表达式,编译期确定,new可以用任何变量作为大小(0或负数是否有意义
动态内存分配在系统的堆上,但是计算器资源是有限的,因此不保证每次new都能返回想要的内存
C++提供了两个标准机制来确认分配是否成功
一个是通过异常,如果分配失败bad_alloc异常会被抛出,如果异常被抛出,然后程序没有对应的handler,程序会停止执行
异常throw可以认为是内建在new操作符里,作为默认行为```c++
foo = new int [5]; // if allocation fails, an exception is thrown

另外一种方式是使用nothrow,如果使用nothrow,则不会抛出异常,直接返回null指针,程序继续运行
实现上是传递一个特殊的对象
`foo = new (nothrow) int [5];`
这种情况需要自己检查指针是否为空
```c++
int * foo;
foo = new (nothrow) int [5];
if (foo == nullptr) {
  // error assigning memory. Take measures.
}

nothrow可能会被异常效率更低,因为有显式地check代码,每次new后都会运行这堆代码,因此更推荐使用异常机制,至少对重要的分配应该这样处理,不过下面的例子主要使用nothrow,因为比较简洁

delete和delete[]

对于大部分情况,动态分配的内存是有明显的生命周期,一旦不需要这些内存,可以把这些内存归还系统,以便后续代码使用,delete的作用就是如此

delete pointer;
delete[] pointer;

delete delete[]和new new[]是配套使用的(操作系统或者c++语言会记录一些信息
delete的输入要么是之前new内配的指针,要么是null指针(此时不会发生任何事)

// rememb-o-matic
#include <iostream>
#include <new>
using namespace std;

int main ()
{
  int i,n;
  int * p;
  cout << "How many numbers would you like to type? ";
  cin >> i;
  p= new (nothrow) int[i];
  if (p == nullptr)
    cout << "Error: memory could not be allocated";
  else
  {
    for (n=0; n<i; n++)
    {
      cout << "Enter number: ";
      cin >> p[n];
    }
    cout << "You have entered: ";
    for (n=0; n<i; n++)
      cout << p[n] << ", ";
    delete[] p;
  }
  return 0;
}

注意new的大小是一个变量
很有可能i输入太大,导致超过系统能分配的内存大小,此时程序会打印分配失败相关语句
通常认为程序能够处理分配失败是一个好习惯

C语言的动态内存

C语言不能使用new和delete,new和delete是操作符,内置于语言,C使用的是库函数malloc和free,是系统调用,机制是不一样的
注意new和malloc不要混用,支持的操作是不一样的

总结

程序员的基本修养:及时释放内存,不要造成内存泄漏,这样会影响程序的可持续性,运行足够长时间后没办法继续运行
delete和delete[]本质上的差别在对class类型进行释放的时候,调用析构函数的区别,那堆内存都会被释放,但是不调用析构函数的话,持有的其他资源没办法释放,比如new的内存、文件、端口号

标签:教程,int,cplusplus,内存,动态内存,new,foo,nothrow,delete
From: https://www.cnblogs.com/xiaoweing/p/17439711.html

相关文章

  • Windows安装VirtualBox教程(图文版)
    VirtualBox是一款免费的虚拟化软件,可以在一台计算机上运行多个操作系统。它可以在Windows、Linux、MacOSX和Solaris等操作系统上运行。VirtualBox支持多种虚拟硬件设备,包括网络适配器、USB控制器、显卡等。用户可以通过VirtualBox创建一个虚拟的计算机环境,安装并运行另一个操作系......
  • 犹猴安装教程
    犹猴安装教程一、安装tampermonkey1.点击以下链接https://www.tampermonkey.net/index.php?browser=edge二、找脚本网址https://greasyfork.org/zh-CN/......
  • 【cpluscplus教程翻译】函数(Functions)
    使用函数,可以独立完成代码任务在c++中,函数是指有名字的语句组,可以被程序的其他点调用最常见的定义函数语法为(也可以使用lambda表达式和重载调用操作符)typename(parameter1,parameter2,...){statements}type是返回值类型,name是函数名,parameter是参数,statements是函数体......
  • 【教程】手把手教你如何修改ChatGPT的密码
    申请OpenAI成功后,如何修改OpenAI的密码?OpenAI并没有内置账号安全管理的选项,因此它其实并没有绑定任何手机号的,手机号只是一道机器验证,邮箱也是。所以如果你用邮箱注册了OpenAI的话,后面是无法修改更换邮箱的。下面教你如何修改ChatGPT的密码,手机电脑端均可修改:第一步,打开OpenAI登陆......
  • Git安装和配置教程:Windows/Mac/Linux三平台详细图文教程,带你一次性搞定Git环境
    Git是一款免费、开源的分布式版本控制系统,广泛应用于软件开发领域。随着开源和云计算的发展,Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法,带你一次性搞定Git环境Windows平台安装Git首先,你需要从Git官网下载Window......
  • Git安装和配置教程:Windows/Mac/Linux三平台详细图文教程,带你一次性搞定Git环境
    Git是一款免费、开源的分布式版本控制系统,广泛应用于软件开发领域。随着开源和云计算的发展,Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法,带你一次性搞定Git环境Windows平台安装Git首先,你需要从Git官网下载Windo......
  • Nessus漏洞扫描工具手把手安装详细教程
    1.下载链接:http://www.tenable.com/products/nessus/select-your-operating-system选择与你的系统对应的版本uname-a#查看自己系统的版本这里是我选择的版本2.安装找到下载位置并打开终端执行以下命令:dpkg-i文件名按照提示进行操作:查看启动状态:netstat-nt......
  • WPF入门教程系列二十六——DataGrid使用示例(3)
    WPF入门教程系列目录WPF入门教程系列二——Application介绍WPF入门教程系列三——Application介绍(续)WPF入门教程系列四——Dispatcher介绍WPF入门教程系列五——Window介绍WPF入门教程系列十一——依赖属性(一)WPF入门教程系列十五——WPF中的数据绑定(一) 五、DataGr......
  • 【教程】Word分离单面打印双面打印内容(清除所有超链接或锁定域)
    ✨Word分离单面打印双面打印内容由于论文正文需要双面打印其余部分都单面打印需要分别把单面打印双面打印分为两个文档分别导出PDF分离内容时由于正文内容被分离会导出PDF时会出现“错误!未定义书签”✨解决方案清除所有超链接清除超链接自然不会出现“错误!未定义书签”Ct......
  • MAC中文版 Final Cut Pro X(FCPX) V10.6.6 专属视频剪辑后期工具安装教程
    MAC中文版FinalCutProX(FCPX)V10.6.6专属视频剪辑后期工具安装教程FinalCutProX又名FCPX,是MAC上非常不错的视频非线性剪辑软件,它剪辑速度超凡,具有先进的调色功能、HDR视频支持,以及ProResRAW,让剪辑、音轨、图形特效、整片输出,支持主流的摄像机格式,是专业视频剪辑领......