C ++中delete
和delete[]
运算符之间有什么区别?
答案 0 :(得分:120)
delete
运算符释放内存并为使用new
创建的单个对象调用析构函数。
delete []
运算符释放内存并为使用new []
创建的对象数组调用析构函数。
在delete
或new []
返回的指针上对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)
运算符delete
和delete []
分别用于销毁使用new
和new[]
创建的对象,返回编译器内存管理器可用的已分配内存。
使用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;
已经检查过这段代码没有记忆泄漏。