For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
内存管理是每一位软件编程开发程序员在工作中都需要重点关注的一个技术问题,而本文我们就通过案例分析来简单了解一下,C语言内存管理实现原理分享。
内存分区
栈区(stack):存放函数形参和局部变量(auto类型)和返回值,由编译器自动分配和释放
堆区(heap):用于动态内存分配该区由程序员申请后使用,需要手动释放否则会造成内存泄漏。如果程序员没有手动释放,那么程序结束时可能由OS回收
全局/静态存储区:存放全局变量和静态变量(包括静态全局变量与静态局部变量),初始化的全局变量和静态局部变量放在一块,未初始化的放在另一块
文字常量区:常量在统一运行被创建,常量区的内存是只读的,程序结束后由系统释放
程序代码区:存放程序的二进制代码,内存由系统管理
对于内置类型,malloc和new没有本质的区别,只是用法不同
C和C++的动态内存申请都是在堆区申请的空间
对于自定义类型,new会调用构造函数,delete会调用析构函数,而malloc和free不会
切记C和C++的申请和释放堆区空间不要混用
new和delete的实现原理
1.内置类型
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL
2.自定义类型
new的原理
先调用operatornew函数申请空间,然后调用构造函数进行初始化
delete原理
先调用析构函数清理资源,然后调用operatordelete函数释放空间
newT[]原理
先调用operatornew[]函数完成N个对象的空间的申请,然后调用N次构造函数进行初始化
delete[]原理
先调用N次析构函数完成N个对象中资源的清理,然后调用operatordelete[]函数释放空间
malloc/free和new/delete的区别
从三个角度分析如下:
1.概念性质:malloc/free是函数,new/delete是操作符
2.使用方法:malloc需要手动计数申请空间的大小且需要将void*类型强转为对应类型,new后面跟着的是类型,只需要按类型申请即可。
3.使用效果:malloc申请的空间不会进行初始化,且申请失败是返回NULL,new申请的空间可以初始化,对应自定义类型会调用它的构造函数进行初始化,delete在释放空间之前会调用析构函数来清理资源。
内存泄漏和内存污染
内存泄漏:只申请,不释放,导致程序使用的内存空间一直增长,只有程序退出,程序使用的所有内存就会释放
所以在使用malloc或者new在堆区申请完空间之后,必须释放分别调用free和delete释放申请的空间,
否则就会造成内存泄漏
内存污染:向没有申请过的内存空间写入数据,可能会覆盖掉原本有用的数据,造成程序崩溃,是坚决不允许的情况
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。