进程调用了malloc后才会有堆区,程序运行过程中可以动态增加堆大小,从低地址向高地址增加,分配小内存时使用该区域(相对于内存映射区而言),
储存函数内局部变量,参数,函数返回值,返回地址,从高地址向低地址储存,函数执行结束时这些存储单元自动被释放。
是一个逻辑概念,是new/delete,申请释放内存的区域,但是大部分编译器是通过底层调用malloc函数申请的内存,所以看上去和堆没什么区别,但程序员也可以通过重载操作符,改用其他内存来实现自由存储,例如全局变量做的对象池,这时自由存储区就不位于堆上了。
全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区
存放一些不允许修改的常量
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等,没有使用相应的函数释放掉,导致系统资源的浪费
基类析构函数:
没有将基类析构函数定义为虚函数,这样基类指向子类对象的时候,不会调用子类的析构函数,子类的资源不会被释放
原文:https://www.cnblogs.com/jobshenlei/p/14620886.html