删除操作符是如何工作的?它比free()更好吗?另外,如果您使用ptr=new char[10]
,然后使用delete ptr
进行删除,指针如何知道要删除多少个位置。
删除操作符是如何工作的?它比free()更好吗?另外,如果您使用ptr=new char[10]
,然后使用delete ptr
进行删除,指针如何知道要删除多少个位置。
只有delete
运算符,free
只存在于函数中。在C++中,建议使用new
/delete
代替malloc()
/free()
。
delete
操作符中有一个内部的“魔法”。当使用new[]
创建数组时,数组的大小会存储在内存块的元数据中。delete[]
利用这些信息。
当然,所有这些都取决于编译器、操作系统、优化器和实现方式。
new
改为 new[]
,将 delete
改为 delete[]
。 - fredoverflowdelete ptr
而不是delete [] ptr
,那么 "magic" 可能会正常工作,也可能不正常工作,这取决于具体实现。 - Mark Ransomstd::vector
而不是数组? - Vlad如果您使用的是非数组类型:
T t = new T;
// ...
delete t;
T t* = new T[10];
// ...
delete [] t;
它将在分配时提供一些额外的信息来告诉它需要删除多少内存。请注意,我们使用delete [] t
,其中有额外的[]
,以告诉它这是一个数组。如果您不这样做,它会认为它只是一个T
,并且仅释放那么多内存。
如果您使用new
,则始终使用delete
,如果您使用malloc
,则使用free
。 new
首先分配内存,然后构造对象。类似地,delete
调用析构函数,然后释放内存。malloc\free
仅处理内存分配和释放。
C++中,使用new关键字调用构造函数,但使用malloc时不会调用。同样地,使用delete删除时会调用析构函数,但使用free时不会调用。
如果你使用MyClass* x = new MyClass[25]创建了一个数组,那么你需要调用delete[] x,这样系统才知道你正在删除(并析构)一组对象而不是单个对象。
实现会为您计算需要销毁的元素数量(使用delete[])。例如:
补充 @Vlad 的回答,如果您使用 new[] 运算符的形式分配内存,例如:
char *c = new char[10];
那么你需要使用相应的删除表单:
delete[] c;
您必须明确告诉编译器在释放内存时使用元数据。
[编辑]
为什么不能使用char c[]
因为编译器需要在编译时知道变量c所需的大小。然而,使用new[]形式告诉它推迟分配直至运行时。因此,出现编译器错误。
char c[] = new char[10];
无法编译,你应该将 c[]
改为 *c
。 - fredoverflow