为了账号安全,请及时绑定邮箱和手机立即绑定

删除C+中的VS删除[]运算符

删除C+中的VS删除[]运算符

C++
慕妹3146593 2019-07-09 10:44:39
删除C+中的VS删除[]运算符.之间的区别是什么?delete和delete[]C+中的运算符?
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

这个delete操作符释放内存,并为创建的单个对象调用析构函数。new.

这个delete []运算符释放内存,并为创建的对象数组调用析构函数。new [].

使用delete返回的指针上new []delete []返回的指针上new导致不明确的行为。


查看完整回答
反对 回复 2019-07-09
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

这个delete[]运算符用于删除数组。这个delete运算符用于删除非数组对象。它叫operator delete[]operator delete函数分别删除数组或非数组对象在(最终)调用数组元素或非数组对象的析构函数后占用的内存。

以下是关系:

typedef int array_type[1];// create and destroy a int[1]array_type *a = new array_type;delete [] a;
// create and destroy an intint *b = new int;delete b;// create and destroy an int[1]int *c = new int[1];delete[] c;
// create and destroy an int[1][2]int (*d)[2] = new int[1][2];delete [] d;

为了new创建一个数组(因此,new type[]new(应用于数组类型构造),标准查找operator new[]在数组的元素类型类或全局范围中,并传递请求的内存量。它可能要求超过N * sizeof(ElementType)如果它想要(例如,存储元素的数量,那么它以后在删除时知道要执行多少析构函数调用)。如果类声明operator new[]除内存量外,还接受另一个size_t,第二个参数将接收分配的元素数量-它可以将其用于它想要的任何目的(调试等.)。

为了new创建非数组对象时,它将查找operator new在元素的类或全局范围中。它传递请求的内存量(完全正确)。sizeof(T)(一直如此)。

为了delete[],它查看数组的元素类型,并调用它们的析构函数。这个operator delete[]函数是元素类型类中的函数,如果没有函数,则在全局作用域中。

为了delete,如果传递的指针是实际对象类型的基类,则基类必须具有虚拟析构函数(否则,行为未定义)。如果它不是基类,则调用该类的析构函数,并且operator delete在那类中还是全局的operator delete被利用了。如果传递了基类,则调用实际对象类型的析构函数,operator delete在该类中找到的是使用,或者如果没有,则使用全局operator delete叫做。如果operator delete类中有第二个类型的参数。size_t,它将接收要释放的元素的数量。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 411 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信