当前位置: 首页 > wzjs >正文

南京软件网站建设公司网站备案号官网

南京软件网站建设公司,网站备案号官网,wordpress ck-video,制作网页的基本步骤目录 1、C/C内存划分 C语言的动态内存管理 malloc calloc realloc free C的动态内存管理 new和delete operator new函数和operator delete函数 new和delete的原理 new T[N]原理 delete[]的原理 1、C/C内存划分 1、栈:存有非静态局部变量、函数参数、返回…

目录

1、C/C++内存划分

C语言的动态内存管理

malloc

calloc

realloc

free

C++的动态内存管理

new和delete

operator new函数和operator delete函数

new和delete的原理

new T[N]原理

delete[]的原理


1、C/C++内存划分

1、栈:存有非静态局部变量、函数参数、返回值等。

2、内存映射段:用于装载共享的动态内存库,用户可使用系统接口创建共享内存,做进程间通信。

3、堆:用于程序运行时动态内存的分配。

4、数据段:存有全局数据和静态数据。

5、代码段:存有可执行代码、只读变量。


2、C语言的动态内存管理

C语言使用malloc、calloc、relloc、free等函数管理动态内存。

malloc

void* malloc (size_t size);

功能:向堆申请一块size字节连续可用的空间,并返回指针,

开辟成功返回指向已开辟好的空间的指针

开辟失败则返回空指针

calloc

void* calloc (size_t num, size_t size);

功能:为num个大小为size字节的元素向堆申请开辟一块空间,并且把空间的每个字节都初始化为0。

与malloc区别在于,malloc不会初始化。

realloc

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

功能:重新分配内存块,该内存块后面有足够的空间就进行原地扩容,不够就异地扩容(在堆上找另一块空间合适的连续空间使用,先将原来内存的数据拷贝到这个内存块中,在释放原来的空间)

free

void free (void* ptr);

功能:释放分配的空间。如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。如果参数ptr是NULL指针,则函数什么事都不做。

3、C++的动态内存管理

new和delete

C++兼容C语言。C语言内存管理方式虽然在C++中可以继续使用,但在有些地方并不够完善,而且使用起来比较麻烦。

因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

new对应delete,new[]对应delete[],必须两两匹配,不匹配的话就是未定义行为。


operator new函数和operator delete函数

new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

operator new函数功能:

1、调用malloc去分配空间,申请成功就直接返回

2、申请空间失败,就会抛出异常

operator delete函数功能:

operator delete 最终是通过free来释放空间的。

扩展(不重要):

operator new源码

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;
申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void* p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}

operator delete源码

#define free(p) _free_dbg(p, _NORMAL_BLOCK)
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK);__TRYpHead = pHdr(pUserData);_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLYreturn;
}

new和delete的原理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:

new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申

请空间失败时会抛异常,malloc会返回NULL。

new的原理

new等价于operate new()+构造函数先申请空间,后在申请的空间上调用构造,operate new()并不是new的重载,因为其参数没有自定义类型

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;
申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void* p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}

由底层代码可以看出operator new是对malloc的封装。

delete原理

delete等价于operator delete()+析构函数先调用析构,再用operator delete释放对象空间

#define free(p) _free_dbg(p, _NORMAL_BLOCK)
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK);__TRYpHead = pHdr(pUserData);_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLYreturn;
}

由底层代码可以看出operator delete()调用了free。

针对有资源要释放的对象时,必须使用delete,free只是释放了对象的空间却没有释放对象内部的空间。


new T[N]原理

1、先调用operator new[]函数,operator new[]中实际调用operator new函数完成N个对象空间的申请。

2、再调用N次构造函数完成N个对象的初始化。

delete[]的原理

1、先调用N次析构函数,完成N个对象中资源的清理

2、再调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间


文章转载自:

http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://00000000.hxrfb.cn
http://www.dtcms.com/wzjs/619635.html

相关文章:

  • 潮州网站seo开发大型网站的最主流语言
  • 如何搭建一个企业子账号网站企业网站设计建设服务
  • 自己做网站流程大连企业建站系统模板
  • 手机网站要域名吗个人云服务器搭建免费
  • 成都大邑网站建设圣都家居装饰有限公司
  • 网站建设与管理找工作广州市用工备案在哪个网站做
  • 哈尔滨网站制作网页wordpress 单页面模板
  • 佛山网站建设工作wordpress 广告 能赚多少
  • 做网站开发学什么酷炫html5网站
  • 网站优化包括对什么优化绘图软件免费版
  • 5昌平区网站建设建设一个网站思路
  • 景区网站建设费用网店如何运营和推广
  • app网站欣赏自己做网站上市
  • 易企秀网站开发技术做科技汽车的视频网站有哪些内容
  • 沧州网站建设公司电话外贸网站域名
  • 电子商务网站建设的一般流程是佛山企业网站设计制作
  • 个人做网站怎么备案网络优化的内容包括哪些
  • 网站建设公司的政策风险做网站前段可以考什么证书
  • 互动网站设计与制作做五金标准件网站
  • 北京国都建设集团网站公司招聘要求
  • 桃子网站logo找不同 网站开发
  • 青岛建设教育网站做电影网站怎么降低内存
  • 苏州网站建设布局seo流量是什么意思
  • 兰州模板型网站建设临沂百度网站推广
  • 有哪些好的网站建设保定网站seo费用
  • 现在建个企业网站要多少钱post wordpress
  • 读书网站怎么做桂林到阳朔怎么走最方便
  • 超值的网站建设梅州企业网站建设公司
  • 做单页面网站山西做网站推广
  • wordpress游戏网站主题做招牌的广告公司