C++ new动态分配内存和delete释放内存_c++使用delete释放一半内存-程序员宅基地


C++中使用简便而强大的new和delete运算符来进行动态内存的分配.

值得注意的是,new和delete和c语言中的malloc和free不同,new和delete是运算符,因此执行效率更高.


如何使用new , delete 呢?

首先我们来看一段代码:

int *p = new int;
我们可以看到有那些元素.

首先是int, 它的含义是声明指针类型;

其次是*p, p是指针变量(注意,指针也是一种变量,可以理解为它的类型为int *)名.

= 是赋值符号,为什么是赋值符号呢?因为后面一段代码返回的是一个地址,地址赋给了p

new int 是什么意思呢?new是一种运算符,它返回的是一种数据类型的内存地址.

一般格式如下:

new typename (value)

所以,之前那一段代码也可以拆分为:

int *p;

p = new int;

如果想给 *p 赋值,应该这样

int *p = new int (12);

这是最基本的声明动态变量方法.


如何用new来声明数组? 首先介绍一维数组:

int *p = new int[4];
和上面不同的是,这段代码后面是 [4],这意味着什么呢?

这意味着new了一个数组元素数为4的一维数组.

OK,任务完成. 可是,细心的小伙伴可能会发现,这样的话, 上面提到给变量赋值的(value)怎么办呢?放在哪呢?

事实上,C++不支持在动态分配数组内存的时候给数组赋初值.所以,想要赋初值,只能自己写个循环语句赋过去咯.


一维数组是这样,那么二维乃至多维呢?

二维可以这样:

int (*p)[3] = new int [4][3];

这样就动态声明了一个行是4, 列是3的数组.

值得注意的是,在此代码 [3] 这个位置,"3"的值可以是常量(1,2...),或者const常量,不能是变量.(表示被坑过) "4"处,可以是变量

还有另一种声明方式:

int **p = new int *[n];
for( int i=0;i<n;++i ) {
	p[i] = new int [m];
}
这样就生成了行为n, 列为m的二维数组了.

这样的方法较前一种复杂些,但m, n都可以是变量.

可以这么理解:先生成了一个以为数组,然后再在每个元素的位置生成一个一维数组,这样,一个二维数组就这样建立起来了.


同样,参照这种方法,可以建立多维数组.


new讲完了,那么delete呢?

delete的作用不做赘述, 我们只讲各种形式如何delete.

首先

int *p = new int;
int *p = new int(1);

这两种delete是一样的

delete p;

然后

int *p = new int [4];

这是一维数组,所以delete的方式有些不同

delete []p;

只有[]的不同:[]告诉程序,应释放整个数组,而不仅是指针指向的元素.

二维数组呢?

for( int i=0;i<n;++i )
	{
		delete [] p[i];
	}
	delete [] p;
注意:

不要用delete来释放同一个内存两次,程序运行会出错.

不要用delete来释放不是new分配的内存

对空指针应用delete是安全的.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wjh2622075127/article/details/78979870

智能推荐

Linux 设备驱动管理之内核对象(Kernel Object)机制-程序员宅基地

文章浏览阅读730次,点赞25次,收藏13次。内核对象是Linux内核中的一个基本抽象,用于表示内核中的所有对象,如设备、模块、文件系统等。它不仅是系统资源的代表,还提供了一种标准化的方式来管理这些资源。内核对象(kobject)是Linux内核中用于管理和表示内核资源的抽象基础结构。kobject机制与sysfs紧密集成,提供了一种标准化的方法来管理不同类型的内核资源,并使内核能够以一种可扩展和动态的方式与用户空间交互。理解kobject对于开发和理解Linux设备驱动至关重要。

全网首发,Python解决某象滑动还原验证码100%还原_python还原验证图片-程序员宅基地

文章浏览阅读1.1k次。与一般的滑动验证码不同,某象的滑动还原验证码是将图像上下两块分割,然后在随机一块往右移动,将两块拼图移动成完整的图像才算成功,事实上,解决这类验证码比普通的验证码还要简单。_python还原验证图片

Win7下多线程中OpenFileDialog和SaveFileDialog失效的解决办法(转载)-程序员宅基地

文章浏览阅读185次。在程序中,通常会使用独立线程来操作OpenFileDialog或者SaveFileDialog控件,但是在某些情况下(Win7系统下)调用 ShowDialog方法并不显示选择路径对话框。此时需要对启动线程的地方进行处理一下即可,方法如下: 方法一 Threadapp=newThread(newParameteriz在程序中,通常会使用独立线程来操作OpenFileDialog或者SaveFile..._win7 openfiledialog

vim常用命令以及配置文件_vim dw命令-程序员宅基地

文章浏览阅读1.7k次,点赞9次,收藏9次。vim常用命令以及配置文件_vim dw命令

python3一键安装脚本_Linux编译安装python3(附一键安装脚本)-程序员宅基地

文章浏览阅读444次。Linux下大部分系统默认自带python2.x的版本,最常见的是python2.6或python2.7版本,默认的python被系统很多程序所依赖,比如centos下的yum就是python2写的,所以默认版本不要轻易删除,否则会有一些问题,如果需要使用最新的Python3那么我们可以编译安装源码包到独立目录,这和系统默认环境之间是没有任何影响的,python3和python2两个环境并存即可首..._python3一键安装脚本

python串口发送大量数据卡顿问题_py通信串口发送数据太快卡掉应用程序-程序员宅基地

文章浏览阅读1.2k次。我用python写了一个FPGA的自动化验证平台,使用串口自动往fpga输入数据,然后我用的python numpy将数组通过串口发送数据。问题就出现在这,我的数组数据量非常庞大,于是我想出了以下解决方案:1,将大数组切分为小数组,多次调用serial.write,中间用定时器隔开(实际我用的时候用的sleep,停止运行,因为懒得查怎么搞定时器,好像并没什么用,还是会很卡顿,有时间再搞清楚定时器吧)。2,将大数组切分为多个小数组,多次调用serial.wtite,不同的是,中间使用serial.fl_py通信串口发送数据太快卡掉应用程序

随便推点

报错:“不是有效的Win32应用程序”的解决办法-程序员宅基地

文章浏览阅读937次。Win7、Win8下用VS2013编译完的程序,拿到32位WindowsXP虚拟机下运行有时候会报错:解决办法如下:进入工程的属性,修改:再修改:即可转载于:https://www.cnblogs.com/predator-wang/p/4788814.html..._tts speak 不是有效的win32应用程序

_tkinter.TclError: invalid command name “tixComboBox“ 的解决办法_invalid command name ".!toplevel.!labelframe.!comb-程序员宅基地

文章浏览阅读762次。修改为 ttk.Combobox()根据Pycharm的自动导入class tkinter.tix.ComboBox,但根据Mannuals描述这个库应该已经废弃了Deprecated since version 3.6: This Tk extension is unmaintained and should not be used in new code. Use tkinter.ttk instead.所以导入ttk自动补全可知应该为ttk.Combobox()..._invalid command name ".!toplevel.!labelframe.!combobox4

常见电机工作原理-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏16次。参考链接:https://space.bilibili.com/1855672581?spm_id_from=333.788.b_765f7570696e666f.1一、直流有刷电机定子:一边一个定子为极性相反的电磁铁转子:由很多线圈绕成,通电后就是电磁铁换向器:换向器上连接着线圈,电机旋转时可以给不同线圈供电保持旋转电刷:后面有个弹簧顶着,使它保持与换向器紧贴着供电二、无刷直流电机1.介绍无刷电机没有电刷,内部不会产生火花或摩擦噪音,也不需要更换、维护电刷。定子具有绕组和线圈激_电机工作原理

python实现局域网攻击_python实现ARP欺骗(宿舍停网警告)-程序员宅基地

文章浏览阅读523次。arp全称为“地址解析协议”,是根据IP获取对应mac地址的一种协议。主机上也是根据arp缓存表进行内网主机的信息交互的,arp缓存表存放着ip对应mac地址的关系。如果一台主机需要上网,就需要先找到自己的网关ip。由于在以太网中都是用mac地址进行主机的交互的,所以要在arp缓存表中根据ip地址查询对应的mac地址。。找到mac地址后就可以将自己的请求发给网关。网关再代之进行转发。这就是一个主机..._py下线局域网

CSS引入方式_css import url-程序员宅基地

文章浏览阅读770次。CSS(层叠样式表)定义了HTML元素在页面中的样式、布局以及整个页面的布局。CSS遵循W3C规范,实现了跨浏览器的标准化。导入的CSS会被直接导入到HTML或CSS文件中,成为文件的一部分。属性设置为目标链接的CSS文件路径,rel属性设置为。表示链接样式表,type属性设置为。3.1 链接样式(最常用)标签链接外部的CSS文件。直接使用HTML元素的。在CSS文件中直接使用。在HTML文件中需要在。在HTML初始化时,_css import url

Java学习笔记_06_main函数必须用public修饰确保调用权限是最大在任何情况下都可以访问;-程序员宅基地

文章浏览阅读179次。一、继承1、通过extends关键字可以实现类与类的继承格式:class 子类名 extends 父类名{}父类:基类、超类子类:派生类以人类、老师类、学生类举例先创建一个人类public class Person { //私有化成员变量 private String name; private int age; //set/get方法 public vo_main函数必须用public修饰确保调用权限是最大在任何情况下都可以访问;

推荐文章

热门文章

相关标签