一道面试题是关于内存空间的申请
char *p=NULL;
p=new char[10];
delete p;
这是道改错题,在网上看到delete后没有[]是释放数组的空间,以为这句话有错就改成
delete []p;
后还想想好象也没错就划了没改,今天用了一小天的时间研究了下这个问题。
void main()
{
char *p=NULL;
p=new char[10];
delete[] p;
//delete p;
}
对于简单的数据类型delete []p 和 delete p是一样的。以为在p=new char[10]的时候在p前13-16位代表数组的大小(
前1-12位不知道表示啥)delete p可以知道数组的大小所以delete []p和delete p结果一样。但对于对象数组就不一样
了如:
void main()
{
class a
{
public :
char *m_pName;
a()
{
m_pName=new char[5];
cout<<"a()"<<endl;
}
~a()
{
delete []m_pName;
cout<<"~a()"<<endl;
}
};
a* c=NULL;
c=new a[2];
delete []c;
}
如果用delete c的话可以释放a[0]的空间时执行~a()结束时会报错,具体原因没查到。看见有的帖子说在<<effective c++>>和<<more effective c++>>中有详细的介绍。青年人网提示如果没有析构函数不报错。
但还是new[] 和delete[]。new和delete成对的用好。
关于malloc和free是c语言里的new和delete是c++里的申请内存操作。
责任编辑:小草