ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

C/C++动态内存申请

2021-04-30 19:33:35  阅读:189  来源: 互联网

标签:malloc temp 申请 C++ 内存 动态内存 new NULL size


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的区别

newmalloc
属性C++中的关键字<stdlib.h>库中的函数
参数申请内存时无须指定内存块的大小,编译器会根据数据类型自行计算需要显式指定内存大小
返回值返回对象类型指针放回void*类型指针,需要强转成需要的类型
分配失败会抛出异常bac_alloc返回NULL
底层实现new的底层实现是mallocmalloc底层实现由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异常。

标签:malloc,temp,申请,C++,内存,动态内存,new,NULL,size
来源: https://blog.csdn.net/w17806532593/article/details/116308435

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有