C ++中的delete和delete[]运算符有什么区别?
vector<>我会尽可能使用而不是数组。
std::unique_ptr<int>(new int[3]),因为它会调用delete未定义行为的常规数组。相反,您需要使用std::unique_ptr<int[]>
C ++中的delete和delete[]运算符有什么区别?
vector<>我会尽可能使用而不是数组。
std::unique_ptr<int>(new int[3]),因为它会调用delete未定义行为的常规数组。相反,您需要使用std::unique_ptr<int[]>
Answers:
该delete运营商释放内存,并呼吁与创建一个对象析构函数new。
在delete []操作者解除分配存储器和析构函数调用用于与创建的对象的阵列new []。
使用delete上的指针返回通过new []或delete []通过返回的指针new导致不确定的行为。
该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该类或全局变量中的in operator delete。如果传递了基类,则将调用实际对象类型的析构函数,并使用operator delete在该类中找到的析构函数;如果不存在,operator delete则调用全局变量。如果operator delete类中的in具有第二个类型的参数size_t,它将接收要取消分配的元素数。
这是c ++ malloc/ free,new/ delete,new[]/中的allocate / DE-allocate模式的基本用法
delete[]
我们需要相应地使用它们。不过,我想补充这个特殊的理解之间的差额delete,并delete[]
1)delete用于取消分配为单个对象分配的内存
2)delete[]用于取消分配为对象数组分配的内存
class ABC{}
ABC *ptr = new ABC[100]
当我们说时new ABC[100],编译器可以获得有关需要分配多少个对象的信息(此处为100),并将为每个创建的对象调用构造函数
但是相应地,如果我们仅使用delete ptr这种情况,编译器将不知道ptr指向了多少个对象,并且最终将调用析构函数并删除仅1个对象的内存(不调用析构函数并释放剩余的99个对象)。因此将存在内存泄漏。
因此我们需要delete [] ptr在这种情况下使用。
free()此而已。如果使用伪析构函数模式,则必须使用for循环为每个对象调用一次。
当我问这个问题时,我真正的问题是:“两者之间有区别吗?运行时是否不必保留有关数组大小的信息,所以它不能说出我们的意思是哪一个吗?” 这个问题没有出现在“相关问题”中,因此只是为了帮助像我这样的人,这是答案:“为什么我们甚至需要delete []运算符?”
delete用于单个指针,delete[]用于通过指针删除数组。
这可以帮助您更好地理解。