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

时间:2010-03-11 14:32:48

标签: c++ memory-management delete-operator

C ++中deletedelete[]运算符之间有什么区别?

7 个答案:

答案 0 :(得分:120)

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

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

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

答案 1 :(得分:80)

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 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)数组的元素类型类或全局范围,并传递请求的内存量。如果需要,它可能请求超过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具有类型为{{1}}的第二个参数,则它将接收要解除分配的元素数。

答案 2 :(得分:12)

这是c ++中allocate / DE-allocation模式的基本用法 malloc / free,new / delete,new [] / delete []

我们需要相应地使用它们。但我想对删除和删除[]

之间的区别添加这种特殊的理解

1)删除用于取消分配为单个对象分配的内存

2) delete [] 用于取消分配为对象数组分配的内存

班级ABC {}

ABC * ptr =新ABC [100]

当我们说new [100] ..编译器可以获取有关需要分配多少对象的信息(这里是100)并将为每个创建的对象调用构造函数

但相应地,如果我们只是在这种情况下使用 delete ptr ,编译器将不知道 ptr 指向的对象数量,并最终将调用析构函数并删除只有1个对象的内存(留下析构函数的调用和剩余的99个对象的释放)。因此会有内存泄漏

所以我们需要在这种情况下使用 delete [] ptr

答案 3 :(得分:4)

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

使用new创建的对象必须使用delete销毁,并且使用new[]删除使用delete[]创建的数组。

答案 4 :(得分:1)

当我问这个问题时,我真正的问题是,"两者之间有区别吗?运行时不必保留有关数组大小的信息,因此它无法分辨我们的意思吗?"这个问题没有出现在"相关问题"中,所以只是为了帮助像我一样的人,这里就是答案:"why do we even need the delete[] operator?"

答案 5 :(得分:-1)

delete用于一个指针,delete[]用于通过指针删除数组。 This可能会帮助您更好地理解。

答案 6 :(得分:-4)

嗯..也许我认为这只是为了明确。 操作员删除和操作员删除[]是区分的,但删除操作员也可以释放数组。

test* a = new test[100];
delete a;

已经检查过这段代码没有记忆泄漏。