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的主要内容,如果未能解决你的问题,请参考以下文章