new/delete

Posted zhiminzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了new/delete相关的知识,希望对你有一定的参考价值。

一、C++中内存大概分为5个区域
(1)栈:函数内的局部变量存放的位置,编译器自动分配和释放
(2)堆:new/malloc分配,delete/free 来释放,没有自己释放,只有等程序结束的时候系统才会回收
(3)全局/静态存储区:存放全局和静态变量,程序结束时系统释放
(4)常量存储区:例如常量字符串等
(5)程序代码区:代码段存放的空间

二、堆、栈的用途和区别
(1)栈:空间有限,由系统分配,分配速度快
(2):只要不超过物理内存,也在系统允许分配的最大内存之内,都可以分配

三、用法
(1)T* p = new T delete p
(2)T* p = new T(初始值) delete p
(3)T* p = new T[数组长度] delete [] p

四、一些注意事项
1、
malloc/free 只是分配/释放内存
new/delete 除了分配/释放内存,还会调用构造/析构函数
2、
new/delete 是关键字,operate new()/operate delete() 是函数。之间的关系如下
new 做了两件事:(a)分配内存(通过operate new() 来分配内存),(b)执行构造函数
delete 做了两件事:(a)执行析构函数,(b)释放内存(通过执行operate delete() 来释放内存)

3、int 和自定义类型的内存泄漏问题

int* p = new int[3]; // 分配12字节,系统《不会》多分配4个字节来,因为内置类型不会执行析构函数,多以不需要记录
delete p; // int 为内置类型,直接释放内存,不需要执行析构函数,该写法不会产生内存泄漏
delete [] p; // 正规的释放内存方式
IElement* p = new IElement3; // IElement 为自定义类型,其分配的内存会多出4个字节,用于记录自定义析构函数执行的次数
delete p; // 程序不能正常运行,因为释放的方式不正确
delete [] p; // 正规的释放内存方式

小结:

如果一个对象用new[] 来分配内存,却用delete p 来释放(而不是delete [] p),需要满足以下条件:
对象的类型为内置对象类型(int,double等),或者自定义类型没有 自己定义的析构函数,
没有析构函数的话,new[] 的时候也不会多分配4个字节来记录析构函数执行的次数

以上是关于new/delete的主要内容,如果未能解决你的问题,请参考以下文章

使用 malloc/free 模拟 new/delete

C++ 中的 new/delete 导致奇怪的内存泄漏

浅谈new/delete和malloc/free的用法与区别

C++ new/delete与 malloc/free

创建类时我应该在哪里放置new / delete

我应该将所有对 new/delete 的调用集中到一个类吗?