2021-4-6 C++内存分配
C++内存管理
C++内存管理分类
- 堆
进程调用了malloc后才会有堆区,程序运行过程中可以动态增加堆大小,从低地址向高地址增加,分配小内存时使用该区域(相对于内存映射区而言),
- 栈
储存函数内局部变量,参数,函数返回值,返回地址,从高地址向低地址储存,函数执行结束时这些存储单元自动被释放。
- 自由储存区
是一个逻辑概念,是new/delete,申请释放内存的区域,但是大部分编译器是通过底层调用malloc函数申请的内存,所以看上去和堆没什么区别,但程序员也可以通过重载操作符,改用其他内存来实现自由存储,例如全局变量做的对象池,这时自由存储区就不位于堆上了。
- 全局/静态储存区
全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区
- 常量区
存放一些不允许修改的常量
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扩容
new分配失败的时候会抛出bad_malloc的异常,而malloc失败直接返回NULL
内存泄漏
是指程序设计的时候,没有及时将申请的内存释放掉,失去了对该段内存的控制,造成内存浪费
分类:
堆内存泄漏:
使用new、malloc、realloc的时候,没有使用对应的delete、free释放,这会导致后面这些内存也不会被使用,产生heap leak;
系统资源泄漏:
程序使用系统分配的资源比如Bitmap,handle,SOCKET等,没有使用相应的函数释放掉,导致系统资源的浪费
基类析构函数:
没有将基类析构函数定义为虚函数,这样基类指向子类对象的时候,不会调用子类的析构函数,子类的资源不会被释放
浙公网安备 33010602011771号