码迷,mamicode.com
首页 > 其他好文 > 详细

new/delete

时间:2020-06-07 01:01:35      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:问题   之间   filter   不能   静态   注意事项   变量   用法   let   

一、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

标签:问题   之间   filter   不能   静态   注意事项   变量   用法   let   

原文地址:https://www.cnblogs.com/zhiminzeng/p/13057835.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!