首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中删除vs delete[]运算符

在C++中删除vs delete[]运算符
EN

Stack Overflow用户
提问于 2010-03-11 22:32:48
回答 5查看 122.3K关注 0票数 158

C++中的delete运算符和delete[]运算符有什么区别?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-11 22:34:56

对于使用new创建的单个对象,delete运算符会释放内存并调用析构函数。

delete []操作符为使用new []创建的对象数组释放内存并调用析构函数。

new []返回的指针上使用delete,或在new返回的指针上使用delete []会导致未定义的行为。

票数 187
EN

Stack Overflow用户

发布于 2010-03-11 22:37:35

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

下面显示了这些关系:

代码语言:javascript
复制
typedef int array_type[1];

// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;

// create and destroy an int
int *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)更多的内容(例如,存储元素的数量,这样在以后删除时,它就知道要完成多少析构函数调用)。如果类声明了一个除了内存量之外还接受另一个size_toperator new[],那么第二个参数将接收分配的元素数量-它可以将该元素用于任何它想要的目的(调试等)。

对于创建非数组对象的new,它将在元素的类或全局作用域中查找operator new。它传递请求的内存量(始终为sizeof(T) )。

对于delete[],它检查数组的元素类类型并调用它们的析构函数。使用的operator delete[]函数是元素类型的类中的函数,如果没有,则在全局范围内。

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

票数 93
EN

Stack Overflow用户

发布于 2010-03-11 22:35:19

操作符deletedelete []分别用于销毁使用newnew[]创建的对象,返回到分配给编译器内存管理器的可用内存。

使用new创建的对象必须使用delete销毁,使用new[]创建的阵列应该使用delete[]删除。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2425728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档