【C/C++ API】C++内存分配和释放函数分析

文章目录

  • malloc
  • realloc
  • calloc
  • memalign
  • posix_memalign
  • free
  • 参考

malloc

malloc 是 C 标准库中的一个函数,用于动态分配内存。它的函数声明如下:

void* malloc(size_t size);

malloc 接受一个参数 size,表示要分配的内存块的大小(以字节为单位)。它会在堆上分配一个大小为 size 字节的连续内存块,并返回一个指向该内存块的指针。

如果内存分配成功,malloc 返回一个指向分配内存的指针。如果分配失败,则返回 NULL

使用 malloc 的示例:

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr;int num_elements = 5;// 分配包含 5 个整数的内存块ptr = (int*)malloc(num_elements * sizeof(int));if (ptr == NULL) {printf("内存分配失败\\n");return 1;}// 使用分配的内存for (int i = 0; i < num_elements; i++) {ptr[i] = i; // 为数组赋值}// 输出分配的内存for (int i = 0; i < num_elements; i++) {printf("%d ", ptr[i]); // 输出 0 1 2 3 4}// 释放内存free(ptr);return 0;
}

在上面的示例中,malloc 用于分配包含 5 个整数的内存块。之后,我们检查是否分配成功,然后使用该内存。最后,在不再需要时,使用 free 函数释放内存块。

realloc

realloc 是 C 标准库中的一个函数,用于重新分配先前分配的内存块的大小。其函数声明如下:

void* realloc(void* ptr, size_t size);

realloc 接受两个参数:

  • ptr:指向先前由 malloccallocrealloc 返回的内存块的指针。如果 ptrNULL,则 realloc 的行为类似于 malloc,即分配新的内存块。
  • size:重新分配内存块的新大小(以字节为单位)。

realloc 会尝试重新分配已分配内存块的大小为 size 字节,并返回一个指向重新分配后的内存块的指针。如果分配成功,返回的指针可能与先前的指针相同,也可能不同;如果分配失败,则返回 NULL

使用 realloc 的示例:

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr;int num_elements = 5;// 分配包含 5 个整数的内存块ptr = (int*)malloc(num_elements * sizeof(int));if (ptr == NULL) {printf("内存分配失败\\n");return 1;}// 使用分配的内存for (int i = 0; i < num_elements; i++) {ptr[i] = i; // 为数组赋值}// 输出分配的内存for (int i = 0; i < num_elements; i++) {printf("%d ", ptr[i]); // 输出 0 1 2 3 4}// 重新分配内存块的大小为 10 个整数ptr = (int*)realloc(ptr, 10 * sizeof(int));if (ptr == NULL) {printf("内存重新分配失败\\n");return 1;}// 输出重新分配后的内存for (int i = 0; i < 10; i++) {printf("%d ", ptr[i]); // 输出 0 1 2 3 4 0 0 0 0 0}// 释放内存free(ptr);return 0;
}

在上面的示例中,我们首先使用 malloc 分配了一个包含 5 个整数的内存块,然后使用 realloc 重新分配了大小为 10 个整数的内存块。注意,我们始终应该检查 realloc 是否返回了 NULL,以确保内存分配成功。

calloc

calloc 是 C 标准库中的一个函数,用于动态分配内存,并将分配的内存空间初始化为零。

其函数声明如下:

void* calloc(size_t num, size_t size);

calloc 接受两个参数:

  • num:要分配的元素个数。
  • size:每个元素的大小(以字节为单位)。

calloc 会分配 num * size 个字节的内存,并返回一个指向该内存的指针。与 malloc 不同,calloc 在分配内存时会将其内容初始化为零。

如果内存分配成功,calloc 返回一个指向分配内存的指针。如果分配失败,则返回 NULL

使用 calloc 的示例:

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr;int num_elements = 5;// 分配包含 5 个整数的内存块,并将其初始化为零ptr = (int*)calloc(num_elements, sizeof(int));if (ptr == NULL) {printf("内存分配失败\\n");return 1;}// 使用分配的内存for (int i = 0; i < num_elements; i++) {printf("%d ", ptr[i]); // 输出 0 0 0 0 0}// 释放内存free(ptr);return 0;
}

在上面的示例中,calloc 用于分配包含 5 个整数的内存块,并将其初始化为零。之后,我们检查是否分配成功,然后使用该内存,最后在不再需要时释放该内存。

memalign

memalign 是 C 标准库中的一个函数,用于分配一块内存,并保证返回的指针地址满足特定的对齐要求。

其函数声明如下:

void* memalign(size_t alignment, size_t size);

memalign 接受两个参数:

  • alignment:所需的对齐字节数,必须是 2 的幂,并且是 size_t 的倍数。
  • size:要分配的内存块的大小(以字节为单位)。

memalign 会尝试分配一块大小为 size 字节的内存,并且该内存的地址是 alignment 的倍数。如果成功,返回指向分配内存的指针;如果失败,返回 NULL

使用 memalign 的示例:

#include <stdio.h>
#include <stdlib.h>int main() {void* ptr;size_t alignment = 16; // 对齐要求为 16 字节size_t size = 64; // 分配内存块的大小为 64 字节// 分配满足对齐要求的内存块ptr = memalign(alignment, size);if (ptr == NULL) {printf("内存分配失败\\n");return 1;}printf("分配的内存地址: %p\\n", ptr);// 释放内存free(ptr);return 0;
}

在上面的示例中,我们使用 memalign 分配了一块大小为 64 字节的内存,并保证其地址满足 16 字节的对齐要求。请注意,alignment 必须是 2 的幂,并且是 size_t 的倍数。

posix_memalign

posix_memalign 是一个 C 语言函数,用于分配一块内存,并保证返回的指针地址满足特定的对齐要求。它在 POSIX 标准中定义,通常用于需要特定内存对齐的场景。

其函数声明如下:

int posix_memalign(void **memptr, size_t alignment, size_t size);

posix_memalign 接受三个参数:

  • memptr:指向指针的指针,用于存储分配内存的地址。
  • alignment:所需的对齐字节数,必须是 size_t 类型的倍数,并且是 2 的幂。
  • size:要分配的内存块的大小(以字节为单位)。

posix_memalign 会尝试分配一块大小为 size 字节的内存,并且该内存的地址是 alignment 的倍数。如果成功,memptr 将指向分配的内存块,并返回 0;如果失败,则返回一个非零值。

使用 posix_memalign 的示例:

#include <stdio.h>
#include <stdlib.h>int main() {void* ptr;size_t alignment = 16; // 对齐要求为 16 字节size_t size = 64; // 分配内存块的大小为 64 字节// 分配满足对齐要求的内存块int result = posix_memalign(&ptr, alignment, size);if (result != 0) {printf("内存分配失败\\n");return 1;}printf("分配的内存地址: %p\\n", ptr);// 释放内存free(ptr);return 0;
}

在上面的示例中,我们使用 posix_memalign 分配了一块大小为 64 字节的内存,并保证其地址满足 16 字节的对齐要求。注意,alignment 必须是 size_t 类型的倍数,并且是 2 的幂。

free

free 是 C 标准库中的一个函数,用于释放由 malloccallocreallocposix_memalign 等函数分配的动态内存。

其函数声明如下:

void free(void *ptr);

free 接受一个参数 ptr,即要释放的内存块的指针。该指针必须是之前调用上述分配函数返回的指针之一,或者是 NULL

调用 free(ptr) 会释放 ptr 指向的内存块,并使该内存块可用于后续的内存分配。在释放内存后,应该避免再次访问已经释放的内存,因为这样做可能导致未定义的行为或程序崩溃。

使用 free 的示例:

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr;ptr = (int*)malloc(sizeof(int)); // 分配内存块if (ptr == NULL) {printf("内存分配失败\\n");return 1;}*ptr = 10; // 向内存块写入数据printf("ptr 指向的值为: %d\\n", *ptr);free(ptr); // 释放内存块return 0;
}

在上面的示例中,我们使用 malloc 分配了一个整数大小的内存块,并将其地址存储在 ptr 指针中。然后,我们向该内存块写入了一个整数值,并使用 printf 输出该值。最后,我们使用 free 释放了分配的内存块,以确保不再使用该内存块。

参考

参考来源–chatgpt3.5,无法确保正确性,请注意甄别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置文件描述符:FD_CLOEXEC(MAC OSX/LINUX)

FD_CLOEXEC是文件描述符标志&#xff0c;用于确保在执行exec调用时关闭文件描述符。当一个文件描述符被设置为FD_CLOEXEC标志时&#xff0c;这个文件描述符会在执行exec调用时自动关闭&#xff0c;这样可以防止在新程序中意外地继承和使用这些文件描述符。 这种特性对于在多进程…

高颜值抓包工具Charles,实现Mac和IOS端抓取https请求

Hi&#xff0c;大家好。在进行测试的过程中&#xff0c;不可避免的会有程序报错&#xff0c;为了能更快修复掉Bug&#xff0c;我们作为测试人员需要给开发人员提供更准确的报错信息或者接口地址&#xff0c;这个时候就需要用到我们的抓包工具。 常见的抓包工具有Fiddler、Char…

【NR技术】 3GPP支持无人机服务的关键性能指标

1 性能指标概述 5G系统传输的数据包括安装在无人机上的硬件设备(如摄像头)收集的数据&#xff0c;例如图片、视频和文件。也可以传输一些软件计算或统计数据&#xff0c;例如无人机管理数据。5G系统传输的业务控制数据可基于应用触发&#xff0c;如无人机上设备的开关、旋转、升…

UHF 无线麦克风的技术设计

一、麦克风介绍 UHF 无线麦克风是一种广泛应用于演讲、表演、会议等场合的音频设备。它通过 UHF 无线电波传输音频信号&#xff0c;具有传输距离远、抗干扰能力强等优点。今天跟大家分享下 UHF 无线麦克风方案的技术设计开发&#xff0c;其主要包括发射机和接收机这两大主要模…

Oracle之ADG与DG的区别?

在上云后的Oracle数据灾备场景中&#xff0c;我们经常听到DBA迁移工程师讲到“在这个项目中用ADG进行数据实时备份&#xff0c;ADG比DG更好&#xff01;”。究竟ADG作Oracle数据灾备的优势在什么地方&#xff1f; 一、ADG主要解决了DG时代读写不能并行的问题 DG时代的数据同步…

c# winform部门管理系统

c# winform部门管理系统 数据库SQL语句脚本代码 CREATE TABLE Department(DepartmentID INT PRIMARY KEY IDENTITY(1,1),Name NVARCHAR(50) NOT NULL ); SELECT * FROM Department -- 插入部门数据 INSERT INTO Department (Name) VALUES (人力资源部); INSERT INTO Departmen…

计算机等级考试:信息安全技术 知识点六

1、P2DR模型是美国ISS公司提出的动态网络安全体系的代表模型&#xff0c;可用数学公式表达为Pt>DtRt&#xff0c;其中Pt表示&#xff1a;系统防护时间。 2、美国联邦政府颁布数字签名标准(Digital Signature Standard&#xff0c;DSS)的年份是1994 3、密码分析者(攻击者)已…

java.net.UnknownHostException

目录 报错信息 报错分析 UnknownHostException 分析 尝试解决 域名 报错可能 网络请求&#xff1a; 数据库连接&#xff1a; Socket通信&#xff1a; 总结&#xff1a; 报错信息 java.net.UnknownHostException Caused by: java.net.UnknownHostException:at java.…

深入浅出:Docker容器虚拟化技术解析

引言&#xff1a; 虚拟化技术的发展自20世纪末至今&#xff0c;经历了令人瞩目的演变。从最初的硬件虚拟化到后来的操作系统级虚拟化&#xff0c;每一次技术革新都为计算资源的管理和利用带来了巨大的变革。而在这不断发展的技术浪潮中&#xff0c;容器虚拟化技术的崛起引领着…

【c 语言 】移位操作符详解

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

【Java 并发】Semaphore

Java 中 的 Semaphore (信号量) 是多线程编程中一种重要的同步工具, 用于控制对共享资源的访问。 通过 Semaphore, 我们可以限制同时访问共享资源的线程数量, 有效地管理并发访问, 确保程序在多线程环境下的稳定性和效率。 在一些资源有限制场景下, Semaphore 是特别合适的, 比…

C++感受1-打开浏览器,线上玩转C++

介绍了五款在线编译、编译、运行的C线上环境。并选择其中的 “在线GDB” 网站动手编写、运行第一个C程序 “Hello World”&#xff0c;同时和线下IDE进行对比。 1. 课堂视频 打开浏览器&#xff0c;线上玩转C 2. 在线C编译环境对比 onlinegdb &#xff1a; www.onlinegdb.comr…

汽车大灯汽车尾灯破裂裂纹破损破洞掉角崩角等问题能修复吗?修复灯罩需要多久时间?

汽车大灯汽车尾灯破裂裂纹破损破洞掉角崩角等问题基本是可以修复的。 修复汽车灯罩的时间取决于多个因素&#xff0c;如灯罩的破损程度、修复方法的选择以及维修店的工作效率等。 一般来说&#xff0c;如果灯罩的破损程度较轻&#xff0c;仅需要进行简单的修复或翻新&#xf…

Python常用语法汇总(三):函数、类

9. 函数 #例1def greet_user(username): # 定义函数 """显示简单的问候语""" print(Hello, username.title() !) greet_user(Jesse) # 调用函数 #例2 def get_formatted_name(first_name,last_name): """返回整洁的姓名&q…

如何考上东南大学计算机学院?

东南大学招生学院是计算机科学与工程学院、苏州联合研究生院&#xff0c;复试公平&#xff0c;不歧视双非考生&#xff0c;985院校中性价比较高&#xff0c;但近年热度在逐年上涨&#xff0c;需要警惕。 建议报考计算机科学与工程学院081200计算机科学与技术专业目标分数为380…

帮管客CRM(jiliyu)接口SQL注入漏洞

文章目录 前言声明一、漏洞描述二、影响版本三、漏洞复现四、修复建议 前言 帮管客CRM客户管理系统专注于为企业提供crm客户关系管理、crm管理系统、crm软件产品及企业销售管理流程解决方案服务,助力企业业绩增长。 声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由…

jdk17出现错误无法初始化主类 和NoClassDefFoundError:Vector的解决方法

概述&#xff1a;网上流传文章大多都是编译和运行都加下面这串代码 --add-modulesjdk.incubator.vector我估计他们大多都是复制粘贴的文章&#xff0c;这种东西就是电子垃圾&#xff0c;在idea中&#xff0c;大多人都习惯用maven来构建java项目&#xff0c;接下来我将讲解使用…

倒计时34,33天

一&#xff1a; 背包问题复习&#xff1a; //01背包&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int N2e56; int v[N],w[N],dp[N]; const int inf0x3f3f3f3f; void solve() {int n,V;cin>>n>>V;for(int i1;i<…

【C++】string学习 — 手搓string类项目

手搓string项目 1 string类介绍2 功能描述3 代码实现3.0 基础框架3.1 构造函数 和 析构函数3.2 流操作符重载 和 尾插扩容3.4 运算符重载3.5 实用功能3.6 迭代器模拟 总结Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇…

LeetCode:206.反转链表

206. 反转链表 解题过程 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; …