首页 > 系统相关 >C语言和C++中的动态内存管理------malloc和free的区别

C语言和C++中的动态内存管理------malloc和free的区别

时间:2024-08-12 22:52:08浏览次数:13  
标签:free malloc int C++ C语言 内存 new size

引言:

动态内存管理:需要根据具体情况来设定需要的内存大小,同时可能需要大于1Mbyte的连续空间。此时我们无法使用静态数组。原因是因为静态数据的开辟是在栈空间,其次栈空间的大小在连续分配时不能超过1Mbyte,因此引入了动态内存管理。


C语言

C语言中动态内存管理的有四个函数:malloc,calloc,realloc,free,都需要引用stdlib.h头文件

动态内存管理所在的区域:堆空间

手动开辟内存

malloc

向堆区申请一块指定大小的连续存储空间。

函数原型:void *malloc(size_t size);

参数:要申请的字节数

返回值:指向这段内存的指针

int* p = (int*)malloc(5 * sizeof(int));
 calloc 

分配连续的内存空间并将空间中的值赋值为0

函数原型:void *calloc(size_t nmemb, size_t size);

参数: nmemb 开辟空间的块数

           size 开辟的每块空间的大小 (开辟了一个数组)

返回值:空间的首字节地址

int* p = (int*)calloc(5, sizeof(int));
realloc 

重新分配内存区块(扩充内存区块),必须在malloc或者calloc之后使用

函数原型:void *realloc(void *ptr, size_t size);

参数: ptr 指向的内存区块的指针

           size 设置的新内存空间大小

  ptr非空 size非空  重新设定内存大小

  ptr为空  size非空  等同于malloc

  ptr非空  size空   等同于free

返回值:新的空间的地址

int* p = (int*)malloc(5 * sizeof(int));
int* p1 = (int*)realloc(p, 7 * sizeof(int));

手动释放内存

free

用来释放从malloc,calloc,realloc成功获取的动态内存分配的空间,只有开辟内存后才可以释放内存

函数原型:void free(void *ptr);

参数:ptr 指向堆空间的指针

free完后一般需要将指针置空,防止多次释放


C++ ----- new/delete

概念

就是内存空间由程序员手动的开辟和释放。

手动开辟内存

开辟单个内存

数据类型* 指针变量 = new 数据类型;

int * p = new int(10);//在 自由存储区 中开辟一个大小是int的空间,并将10存进去,将该空间变量首地址返回
开辟连续的多个内存

数据类型* 指针变量 = new 数据类型[长度];

int* p = new int[n](10);
int* p1 = new int[n]{1,2,3,4,5,6,7};

释放内存

释放单个内存

delete 指针变量;

释放连续的多个内存

delete[] 指针变量

new,malloc区别

1 new/delete是C++中的运算符。malloc/free是C语言中的库函数。

2 malloc申请内存空间时,手动计算所需大小。new只需要类型名,自动计算大小。

3 malloc申请的内存空间不会初始化。new可以初始化。

4 malloc的返回值为void*,接收时必须强转。new不需要。

5 malloc申请空间失败时,返回的是NULL,使用时必须判空。new申请空间失败时抛出异常,。

6 new/delete会调用构造、析构函数。malloc/free不会调用。

标签:free,malloc,int,C++,C语言,内存,new,size
From: https://blog.csdn.net/you_52/article/details/141143690

相关文章

  • SecureCoding in C and C++(二)
    经过上期的环境搭建过后,我们将正式的学习C++系列,首先要学习的是C++的一些常用的变量从编译和连接学起似乎也是不错的选择。个人总结的一句话:编译其实就是对预处理语句进行处理后,然后对语句进行处理。对预处理语句,例如:#include之类的处理方式其实就是将文件内容复制到对应......
  • C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例
    什么是CPPCMS?CppCMS是一个高性能的C++Web开发框架,专为构建快速、动态的网页应用而设计,特别适合高并发和低延迟的场景。其设计理念类似于Python的Django或RubyonRails,但针对C++提供了更细粒度的控制和更高效的性能。主要特点和优点1.高性能与并发处理​Cp......
  • C++类和对象(类的定义)
    目录一·类的定义1.1类的定义格式1.2访问限定符(public、private、protected)1.3类域一·类的定义1.1类的定义格式定义类的关键字是class,类定义结束时,后面的分号不能省略。类体中的内容称为类的成员:①类中的变量称为类的属性或成员变量;②类中的函数称为类的方......
  • 【C语言】简单位运算
    判断奇偶:奇:(x&1)==1⟺(x&1)!=0偶:(x&1)==0⟺(x&1)!=1乘(或除)以2的幂次:x>>n⟺x/2^nx<<n⟺x*2^n去除最后一位1:x&(x-1)得到最后一位1:x&-x判断2的幂次:x&(x-1)==0交换两个数:a^=b;b^=a;a^=b;交换符号:......
  • 【C++面向对象】泛型编程(模板) 新手小白都能懂!
    目录泛型编程是什么?模板和泛型编程的关系?函数模板定义调用类模板定义调用总结/小注泛型编程是什么?顾名思义,“泛型”即“广泛的类型”,即不拘泥于一种特定类型的编程方法。在泛型编程时,我们通常使用一个或多个类型占位符来表示一种或多种类型,这些类型对于模板而言......
  • c++两人组合账号
    周小灵彤:周小灵彤(六年级)-CSDN博客王小灵弘:wanghongyv-CSDN博客这是联合账号,因为我们俩懒太勤快了(嘻嘻)                                                     ......
  • C语言学习心得-二维数组
    (一)二维数组的定义和初始化定义二维数组arr[3][5]:intarr[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};仔细看这个数组arr[0] 是第一个一维数组,包含元素 arr[0][0],arr[0][1],arr[0][2],arr[0][3],arr[0][4]arr[1] 是第二个一维数组,包含元素 ......
  • NDT算法详解与C++实现
    点云匹配在感知环节是一个很重要的信息获取手段,而其中的算法也有几个比较经典了,例如ICP(IterativeClosestPoint,迭代最近点)算法,而本文决定记录学习的是NDT算法,也就是NormalDistributionTransform,正态分布变换算法。什么是正态分布变换算法呢,简言之,就是把空间中的点云进行整......
  • C语言问答进阶--4、基本运算符
    赋值运算符A:下面将介绍赋值操作符。它的符号就是 = .A:赋值操作符,就是把一个值赋值给左边的变量。正如以前说的形如a=1之类的表达就是赋值运算符的具体应用。也许有的人在编写代码的时候写过这种代码:#include "iostream.h"int main(){    int x;    1=x;......
  • C语言——文件操作
     数据持久化的方法:1.把数据存放到磁盘文件(使用文件可以将数据直接存放在电脑的硬盘上,做到数据的持久化)2.存放到数据库 什么是文件呢?磁盘上的文件就是文件。在程序设计中,一般谈及的文件有两种,从文件功能的角度来分类,有:1.程序文件:如 源程序文件(.h)   目标文件(wi......