C++中new(delete)和malloc(free)的常见问题

来源:互联网 发布:机械厂适合的软件 编辑:程序博客网 时间:2024/06/10 20:16

C++中new(delete)和malloc(free)的常见问题

Q: "delete p"会释放"p"指针,还是"p"指向的内容"*p"?
A: 会释放"p"指向的内容"*p".
"delete"真正的含义是"delete the thing pointed to by";同样free(p)也是删除释放"p"指向的内容.
至于指针p没有做任何的改变,如果想让我们的程序更加健壮,建议加入下面的一行代码:
p = NULL;
尤其在程序中频繁使用p的时候,这行代码将显得很重要.

Q: 我能用"free()"掉由"new"申请到的,用"delete"掉由"malloc()"申请到的内存吗?
A: 不能.
malloc/free,new/delete必需配对使用!
free掉new申请出来的内存或delete掉malloc申请出来的内存该被痛骂一通.

Q: new/delete和malloc/free有什么区别?
A: 这是一个老问题, 面试官常会问到的问题.
可以从是否调用构造函数/析构函数,类型安全性,是否被重载三个方面讨论:
new/delete会调用构造函数/析构函数;
malloc()返回的是一个不具有类型安全性的"void *",而new会返回正确形态的指针;
new/delete是可以被重载的一个运算子;malloc/free是不能被重载的.

Q: 为什么C++不为"new"来搭建一个类型于"malloc"的realloc()的"函数"呢?
A: 避免产生意外.
realloc()这样的函数会破坏大部分的C++对象.

Q: 如何用new/delete去申请/释放数组?
A: 用new[]和delete[]去实现.
int * p_obj = new int[100];
// ...
delete [] p_obj;
在"new"运算式中使用了"[...]",就必须在"delete"运算式中使用"[]".

Q: 忘记了将"[]"用在"delete"由"new int[100]"申请的数组,会发生什么事?
A: 灾难.
new[]和delete[]正确配对是程序员的,而不是编译器的责任.堆(heap)被破坏是最可能产生的后果,更坏的可能是程序down掉.

Q: "delete this"是合法的吗?
A: 不建议这样使用. 然后这样使用是合法的,只要我们足够小心.这里的小心点有:
1)要确定"this"是由"new"申请来的(而不是new []);
2)确保完成"delete this"后,不能再去碰"this"的对象了,甚至不能碰"this"了,包括不能查看它,或是跟NULL比较.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 木瓜奇迹忘记升级过头转职了怎么办 孩子进入青春期什么坏事都干怎么办 母狗狗第一次来月经应该怎么办图 社保断了想补缴怎么办?这些要知道 换工作社保断了一个月怎么办 北京社保中间断了几个月怎么办 农保和社保都交了医保怎么办 如果交了社保结婚生孩子断了怎么办 南京社保中间断了几个月怎么办 mu大师等级技能点加点太慢怎么办 永恒纪元戒不是本职业套装石怎么办 全民奇迹忘记在哪个区了怎么办 全民奇迹安卓的忘记那个区了怎么办 大天使之剑h5所在服人少怎么办 买的裙子因为好看没有勇气穿怎么办 魅蓝s6锁屏密码忘了怎么办 u盘被占用不能安全弹出怎么办 洛克王国得到了魔攻巨蟹座怎么办 在育碧下载游戏下一半不下了怎么办 轩辕传奇单机版忘记哪个区了怎么办 登腾讯游戏动态密码啥意思怎么办 说了不该说的话别人不原谅怎么办 轩辕传奇手游金币用错了怎么办 神秘时代4法杖按键冲突怎么办 孕2个月发烧38度怎么办 不知道怀孕喝了止咳糖浆怎么办? 小孩刮头发的备皮刀割住手怎么办? 天梭手表里面的刻度掉了怎么办 国战天下手游帐号丢失怎么办 肺力咳合剂一次喝了50多了怎么办 头孢和藿香正气水一起吃了怎么办 小儿胃蛋自酶合剂吃多了怎么办 刚出生的婴儿很容易被惊醒怎么办 1个多月的宝宝小腿不直怎么办 20个月宝宝腿不直小腿外八怎么办 小孩手青枝骨骨折拆石膏还弯怎么办 宝宝喝柴胡注射剂有不良反应怎么办 九个月宝宝便秘拉不出来怎么办 一岁四个月的宝宝便秘怎么办 热血三国3要塞打不过去怎么办 清香木夏天有黄叶和掉叶怎么办