成对使用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)