首页 > 编程语言 > 详细

2021-4-6 C++内存分配

时间:2021-04-06 14:48:06      阅读:13      评论:0      收藏:0      [点我收藏+]

C++内存管理

C++内存管理分类

进程调用了malloc后才会有堆区,程序运行过程中可以动态增加堆大小,从低地址向高地址增加,分配小内存时使用该区域(相对于内存映射区而言),

储存函数内局部变量,参数,函数返回值,返回地址,从高地址向低地址储存,函数执行结束时这些存储单元自动被释放。

  1. 自由储存区

是一个逻辑概念,是new/delete,申请释放内存的区域,但是大部分编译器是通过底层调用malloc函数申请的内存,所以看上去和堆没什么区别,但程序员也可以通过重载操作符,改用其他内存来实现自由存储,例如全局变量做的对象池,这时自由存储区就不位于堆上了。

  1. 全局/静态储存区

全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区

  1. 常量区

存放一些不允许修改的常量


new和molloc的区别

int * a = ( int * ) malloc ( n * sizeof ( int ) )
int * a = new int;

new分配的内存是带有类型信息的,而malloc是没有的
new返回的指定对象的指针,malloc返回的void * ,mallc返回值一般需要进行类型转化
new分配内存的时候会调用构造函数
new分配的内存释放时是使用delete的,delete释放的内存会调用析构函数,而malloc释放的时候是调用free的
new是一个操作符,而malloc是库函数,所以new可以重载
malloc分配内存不够时可以用realloc扩容

realloc扩容原理

new分配失败的时候会抛出bad_malloc的异常,而malloc失败直接返回NULL


内存泄漏

是指程序设计的时候,没有及时将申请的内存释放掉,失去了对该段内存的控制,造成内存浪费
分类:
堆内存泄漏:

使用new、malloc、realloc的时候,没有使用对应的delete、free释放,这会导致后面这些内存也不会被使用,产生heap leak;

系统资源泄漏:

程序使用系统分配的资源比如Bitmap,handle,SOCKET等,没有使用相应的函数释放掉,导致系统资源的浪费

基类析构函数:

没有将基类析构函数定义为虚函数,这样基类指向子类对象的时候,不会调用子类的析构函数,子类的资源不会被释放

2021-4-6 C++内存分配

原文:https://www.cnblogs.com/jobshenlei/p/14620886.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!