C/C++动态内存申请
2021/5/1 7:27:14
本文主要是介绍C/C++动态内存申请,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C/C++中动态内存分配
(一)分配方法:new和malloc
1.new和delete
在C++中,可以使用new为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。如果不再需要动态分配的内存空虚,需要使用delete,删除之前由new运算符分配的内存。
通用语法
new data-type // 在这里,data-type 可以是包括数组在内的任意内置的数据类型,也可以是包括类或结构在内的用户自定义的任何数据类型。
例子:
char* temp = NULL; temp = new char; // 如果不使用了需要释放内存 delete temp;
2.malloc和free
malloc是C标准库<stdlib.h>中的函数, 函数声明:void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针,其中size参数是内存块的大小,以字节为单位。malloc用完后需要用free函数进行内存释放。
例子:
char* temp = NULL; temp = (char*)malloc(10);// malloc返回的类型是void,需要强转成对应的类型 memset(temp, 0, 10);// 初始化内容,全部置为0 // 一般需要检查返回是指针是否为NULL(内存分配可能失败了,返回NULL) if(!temp) { //do something.... } //释放内存 free(temp); temp = NULL;// 防止野指针
3.new和malloc的区别
new | malloc | |
---|---|---|
属性 | C++中的关键字 | <stdlib.h>库中的函数 |
参数 | 申请内存时无须指定内存块的大小,编译器会根据数据类型自行计算 | 需要显式指定内存大小 |
返回值 | 返回对象类型指针 | 放回void*类型指针,需要强转成需要的类型 |
分配失败 | 会抛出异常bac_alloc | 返回NULL |
底层实现 | new的底层实现是malloc | malloc底层实现由brk、mapp、munmap系统调用实现 |
(二)new 底层实现
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) { //try to allocate size bytes void *p; while ((p = malloc(size)) == 0)// 通过while循环进行malloc内存申请 { if (_callnewh(size) == 0) { //report no memory //申请失败,抛出bad_alloc异常 static const bad_alloc nomem; _RAISE(nomem); } } return (p); }
从上述代码可以看到,new的底层实现是通过一个while循环用malloc进行内存申请,如果申请不到就执行_allnewh(size)判断用户是否用设置回调函数,如果用户没有设置回调函数,就会抛出bad_alloc异常。
这篇关于C/C++动态内存申请的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26MATLAB 中 A(7)=[];什么意思?-icode9专业技术文章分享
- 2024-11-26UniApp 中如何实现使用输入法时保持页面列表不动的效果?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中怎么实现输入法弹出时禁止页面向上滚动?-icode9专业技术文章分享
- 2024-11-26WebSocket是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-26页面有多个ref 要动态传入怎么实现?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中实现一个底部输入框的常见方法有哪些?-icode9专业技术文章分享
- 2024-11-26RocketMQ入门指南:搭建与使用全流程详解
- 2024-11-26RocketMQ入门教程:轻松搭建与使用指南
- 2024-11-26手写RocketMQ:从入门到实践的简单教程
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版