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比较.