成对使用new与delete时要采取相同的形式

时间:2020-05-14 13:34:24   收藏:0   阅读:49
string* Array=new string[100];
delete Array;//错误的动作

Array中所含的100个对象中的99个不太可能被适当的删除,因为它们的析构函数很可能没有被调用。

当使用new时,有两件事发生。第一,内存被分配出来;第二,针对此内存会有一个或更多构造函数被调用。当使用delete时,有两件事发生。第一,针对此内存会有一个或更多的析构函数被调用;第二,然后内存才被释放。delete最大的问题在于被删除的内存内究竟有多少个对象?这个问题的答案决定了有多少个析构函数必须被调用起来。

当对一个指针进行delete时,delete需要知道要调用几次析构函数,而唯一能让delete知道内存中是否有一个“数组大小记录”的方法就是由我们告诉编译器,使用delete时加上中括号[],便是告诉delete指针指向一个数组,需要调用多次析构函数,否则delete认定指针指向单一对象,只调用一次析构函数。

 

string* ptr=new string;
delete [] ptr;//错误动作

上述代码会发生什么?这相当于告诉delete要去删除一个数组,所以delete会去读取若干内存并将它解释为“数组大小”,然后再开始调用多次的析构函数,浑然不知它所处理的那块内存不但不是个数组,甚至并未包含要销毁的对象。

原文:https://www.cnblogs.com/cs0915/p/12887990.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!