在C ++中删除vs delete 操作符

C ++中的deletedelete[]操作符有什么区别?

delete操作符解除分配内存,并调用用new创build的单个对象的析构函数。

delete []操作符将释放内存,并调用由new []创build的对象数组的析构函数。

对由new []返回的指针使用delete ,或对未定义行为的new结果返回的指针使用delete []

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; 

对于创build一个数组的new type[] (因此,无论是new type[]还是应用于数组types构造的new ),标准将在数组的元素types类或全局作用域中查找operator new[] ,请求的内存量。 如果需要,它可以请求超过N * sizeof(ElementType) (例如存储元素的数量,所以在删除之后知道有多less析构函数调用完成)。 如果这个类声明了一个operator new[] ,那么额外的内存可以接受另一个size_t ,那么第二个参数将会得到分配的元素的数量 – 它可以用于任何目的(debugging,等等)。

对于创build一个非数组对象的new函数,它将在元素的类或全局范围内查找operator new 。 它传递所请求的内存量(确切地说sizeof(T)总是)。

对于delete[] ,它会查看数组的元素类types并调用它们的析构函数。 所使用的operator delete[]函数是元素types类中的函数,或者是全局范围内没有的函数。

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

这是在c ++ malloc / free,new / delete,new [] / delete []中分配/ DE分配模式的基本用法

我们需要相应地使用它们。 但是,我想添加这个特殊的理解删除和删除[]之间的区别

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

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

ABC类{}

ABC * ptr =新ABC [100]

当我们说new [100]时,编译器可以获得有关需要分配多less个对象(这里是100)的信息,并且将为每个创build的对象调用构造器

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

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

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

new创build的对象必须用delete ,用new[]创build的数组应该用delete[]

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