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[]
用于通过指针删除数组。
这可以帮助您更好地理解。