c++ 动态数组

article/2025/10/3 14:04:41

动态数组


相关数组知识连接
数组详解
多维数组


在之前的文章中,讲解了数组的相关知识,那一种数组(数组相关连接:https://blog.csdn.net/m0_62870588/article/details/123787052)又称是静态数组,因为它的大小从头到尾是固定的。在这里将会讲解动态数组的相关知识。动态数组,严格意义上讲并不是数组,程序会使用指针来承载malloc( )或者new操作符动态分配的内存空间,然后在需要更新数组大小或者释放空间的时候使用free () 或者delete。


使用malloc()和free()动态分配内存

malloc()函数可以在一个叫堆(Heap)的内存空间中分配指定字节数的内存。与作用域中在栈(Stack)中分配内存的局部变量不同,堆中的内存一旦分配,就不会自动释放,直到数据调用free()函数.

使用malloc()

#include<iostream>
using namespace std;//使用malloc()int main()
{int *arr = (int*)malloc(5*sizeof(int)) ;int *ptr = arr;for ( int i = 0;i < 5; i++ ){*ptr = i;cout << *ptr << " ";ptr++; //也可以直接写成 cout << *(ptr++)<<" ";}cout << endl;free(arr);arr = NULL;return 0 ;
}

运行结果
展示了malloc()和free()的应用。
在这里插入图片描述
示例中,先使用malloc()分配了大小为“ 5 * sizeof(int)”字节的内存。malloc()的分配单位是字节,所以要用sizeof操作符获取整形int的字节数。此外,由于malloc()返回 void * 指针,因此也要将返回值转换为需要的指针类型;分配完内存之后我们就用另一个指针来遍历这个动态的数组,最后需要记得用free()函数释放内存。

对于动态数组来说,因为内存不会自动释放,所以如果遗漏free(),就会发生内存泄漏(Menory Leak),也就是说已分配的内存会一直被占用,别的程序就不能使用这一块内存了。

举个例子说明一下这个概念,可以用现实生活中更衣室的柜子来类比:更衣室的柜子在出租之后就会被上锁,顾客在使用一段时间后,把东西拿了出来,关上柜子却忘记归还钥匙就离开了。这个情况下管理人员是没有钥匙的,尽管柜子是空的却也不能提供给另外一名顾客使用。堆中的内存也是如此,如果不释放,就算只用那块内存的程序已经终止,那块内存也是处于被占用的状态。

另一个值得注意的点是,在调用free()函数的时候我们不能使用ptr,而必须使用arr。这是因为ptr在遍历结束之后指向的是动态数组的末尾元素,如果使用free()释放 5 * sizeof(int)字节内存,就会触动到最后一个元素后面的未知的内存段。

提示: 在c++程序中,如果使用动态内存分配,一定要让free()或delete与malloc()和new 匹配,即在程序中一次内存分配一定要有相对应的一次相同大小的内存释放。释放多次相同的内存、没有释放内存以及释放内存大小不匹配都是不能接受的。

此外,在释放内存后将指针重新赋值为NULL是一个非常好的习惯。这是因为对指针用了free()之后不会改变指针的值,也就是指向的地址。在之后的程序中可能会忘记这个内存的地址已经被释放,而再次使用这个指针就会导致程序异常。这个时候如果指针是NULL,就会被许多条检查拦截(就像把指针初始化NULL一样),从而避免许多潜在问题。


使用new和delete两个操作符

malloc()和free()在C语言中就存在了,c++只是继承了他们。为了更好的只支持对象的内存管理,c++引入了new和delete两个操作符。

使用new和delete

#include<iostream>
using namespace std;//使用new和deleteint main()
{int *numPtr = new int (3);cout << *numPtr << endl;delete numPtr;int *arr = new int [5];int *ptr = arr;for ( int i = 0; i < 5;i++){*ptr = i ;cout << *ptr << " " ;ptr++; //也可以直接写成cout << *(Ptr++) << " " ;}cout << endl;delete [] arr;arr = NULL;return 0 ;
}

运行结果
在这里插入图片描述
从示例中可以看出,new和delete在总体上还是malloc()和free()类似的,由于new与类似相关,因此写法上还会更简洁一些。在例子中,使用了两组new/delete对,第一个new分配了一个初始值为3的整数(这里用到了雷子于构造函数的初始方法)这个语句也可以写成“ int * numPtr = new int ;”,这样写的话整型就只有一个未知的初值。这是因为再分配了内存却没有赋值的情况下,该内存段可能还保留着上一次分配后存储的某个值。
第一组new/delete的语法相对来说比较直观。第二个new后面跟着变量类型以及元素的个数,这样的语法类似于数组的创建,而实际上也表示分配一段能放下5个int大小的内存。这里不需要像使用malloc()那样指定一字节为单位的内存大小,这样也使得程序更具有可读性。对于delete来说,如果用new分配了数组,那么就需要在delete和指针名之间加上一对括号([])以表示释放数个指针类型大小的空间,不然只会像delete numPtr那样删除一个元素,这也是new/delete与malloc()/free()的一个重要区别。


相关数组知识连接
数组详解
多维数组


如果对您有帮助,点赞支持一下吧~


http://chatgpt.dhexx.cn/article/PNrV3Q2p.shtml

相关文章

C语言中动态分配数组

很多人在编写C语言代码的时候很少使用动态数组&#xff0c;不管什么情况下通通使用静态数组的方法来解决&#xff0c;在当初学习C语言的时候我就是一个典型的例子&#xff0c;但是现在发现这是一个相当不好的习惯&#xff0c;甚至可能导致编写的程序出现一些致命的错误。尤其对…

C语言学习笔记:动态数组

动态数组 数组是C语言中的很重要的一种构造类型&#xff0c;最初我们学习的都是静态数组&#xff0c;但是&#xff0c;静态数组有着自己难以改变的缺点——数组长度固定。 一般在静态数组定义后&#xff0c;系统就会为其分配对应长度的连续的专有内存空间&#xff0c;可是&am…

C语言如何实现动态数组?

提出问题 请问在c语言里如何实现动态大小的数组啊&#xff0c;比如说int a[N];&#xff0c;这里N的值可以在程序中定&#xff0c;或者有什么方法可以实现类似的功能&#xff1f;总之只要在编译时不用制定数组大小就行。 分析问题 嵌入式系统的内存是宝贵的&#xff0c;内存是否…

C的动态数组的详细知识(网上收集到的大量详细知识以及个人理解的汇总)

动态数组是指在声明时没有确定数组大小的数组&#xff0c;即忽略圆括号中的下标&#xff1b;当要用它时&#xff0c;可随时用ReDim语句重新指出数组的大小。使用动态数组的优点是可以根据用户需要&#xff0c;有效利用存储空间。 可以了解动态数组的详细定义 一.C版本动态数组…

动态数组C语言实现详解

目录 0、前言 一、动态数组数据结构 二、动态数组增删改查函数声明 三、数组创建 1、头部动态创建 2、头部静态创建 四、元素添加 五、元素删除 1、根据元素值删除 2、根据元素位置删除 六、元素修改 七、元素查找 八、数组清空 九、数组销毁 十、验证程序 0、前…

C语言实现 动态数组 处理任意类型数据

引言&#xff1a;动态数组在C/C、Java、Python等语言中应用广泛&#xff0c;高级语言一般通过调用类或接口等可以快捷使用&#xff0c;C语言实现动态数组需要手动构造&#xff0c;以下为实现过程。 1 结构体构造动态数组 typedef struct Array {void **p; //维护在堆区…

C语言创建动态数组

C语言创建动态数组 1.编写步骤 1. 添加所需头文件 stdlib.h 该头文件下包含的与分配存储区相关的函数如下&#xff1a; void* malloc (size_t size);//从堆中分配size字节的存储空间 void* calloc (size_t num, size_t size);//分配数组并将数组零初始化。为 num 个元素的数…

在OpenCV里实现开运算

前面学习腐蚀和膨胀算法,并且深刻地认识到它们的特性以及作用。如果由这两种组合出来的运算又有什么样的不同呢?比如一个图像先腐蚀后膨胀的操作,会有什么结果呢?因为腐蚀是把图片白色变小,膨胀又是把图片白色变大,是否会保持原图不变呢?带着这些问题来研究一下先腐蚀后…

OpenCV python 形态学 圆形开运算

处理流程 # -*- coding: utf-8 -*- # note : 形态学 开运算 圆形内核 处理 # --------------------------------import cv2 as cv import numpy as npdef opening_circle(img_bin, kernel_size10):# 形态学kernel np.zeros((kernel_size, kernel_size), np.uint8)center_…

腐蚀、膨胀、开运算、闭运算

一、腐蚀、膨胀、开运算、闭运算 腐蚀&#xff1a;图像中的高亮部分进行膨胀 膨胀&#xff1a;原图中的高亮部分被腐蚀&#xff0c;类似于领域被蚕食 开运算&#xff1a;先腐蚀再膨胀&#xff0c;可以去掉目标外孤立的点 闭运算&#xff1a;先膨胀再腐蚀&#xff0c;可以去掉目…

【youcans 的 OpenCV 例程200篇】137. 灰度开运算和灰度闭运算原理

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】137. 灰度开运算和灰度闭运算 5. 灰度级形态学 灰度级形态学将形态学操作从二值图像扩展到灰度图…

开闭运算

开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理。但这两者并不是可逆的&#xff0c;即先开后闭并不能得到原来的图像。 开运算 开运算是先腐蚀后膨胀&#xff0c;其作用是&#xff1a;分离物体&#xff0c;消除小区域。特点&#xff1a;消除噪点&#xff0c;去除小的干扰…

图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作

大家看这篇博文前可以先看一看下面这篇博文&#xff0c;下面这篇博文是这篇博文的基础&#xff1a; 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作 图像形态学腐蚀可以将细小的噪声区域去除&#x…

OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一、引言 在《OpenCV-Python图像处理&#xff1a;腐蚀和膨胀原理及erode、dilate函数介绍 https://blog.csdn.net/LaoYuanPython/article/details/109441709》等系列博文中老猿详细介绍了腐蚀和膨胀的原理、…

灰度级形态学 - 灰度开运算和灰度闭运算

目录 1. 介绍 2. code 1. 介绍 灰度级的开运算和闭运算和二值图像的处理一样&#xff0c;只不过一个作用于灰度图&#xff0c;一个作用于二值图像 灰度级的开运算公式为&#xff1a; 先对图像做腐蚀&#xff0c;然后对腐蚀的结果做膨胀运算 灰度级的闭运算公式为&#xff…

OpenCV(七)形态学操作2--开运算与闭运算

目录 概述&#xff1a; morphologyEX()函数 一、开运算&#xff08;分开&#xff09; 1、基础理论 1、作用&#xff1a; 2、代码 3、效果 二、闭运算&#xff08;封闭&#xff09; 1、基础理论 1、作用 2、过程 2、代码 3、效果 总代码 参考资料&#xff1a; 概述…

开运算—闭运算

转载&#xff1a;https://blog.csdn.net/hanshanbuleng/article/details/80657148 如果不了解腐蚀与膨胀原理的同学那请看我前一期博客哦&#xff01;&#xff09; 1.开运算 开运算 先腐蚀运算&#xff0c;再膨胀运算&#xff08;看上去把细微连在一起的两块目标分开了&…

Halcon形态学处理-腐蚀、膨胀、开运算、闭运算、顶帽运算和底帽运算

提示&#xff1a;文章参考了网络上其他作者的文章&#xff0c;以及相关书籍&#xff0c;如有侵权&#xff0c;请联系作者。 文章目录 前言一、腐蚀和膨胀1.腐蚀2.膨胀 二、开运算和闭运算1.开运算2.闭运算 三、顶帽运算和底帽运算1.顶帽运算2.底帽运算 总结参考文献 前言 图像的…

Opencv中的开运算和闭运算操作讲解(python实现)

文章目录 1.首先了解腐蚀和膨胀原理2.开运算&#xff08;1&#xff09;为什么开运算可以去白噪点呢&#xff1f;&#xff08;2&#xff09;.函数讲解&#xff08;3&#xff09;代码实战 3.闭运算&#xff08;1&#xff09;函数讲解&#xff08;2&#xff09;代码实战 1.首先了解…

膨胀 腐蚀 开运算 闭运算 matlab,11. 形态学膨胀、腐蚀、开运算、闭运算

1. 膨胀:对边界点进行扩充,填充空洞,使边界向外部扩张的过程。 2. 腐蚀:消除物体边界点,使边界向内部收缩的过程,把小于结构元素的物体去除掉。 3. 开运算: 先腐蚀后膨胀的过程称为开运算,作用:去除孤立的小点,毛刺,消除小物体,平滑较大物体边界,同时不改变其面积。 4. 闭…