C++中的删除如何知道要删除多少内存位置

shr*_*sva 5 c++ memory-management

删除操作符如何工作?它比free()更好吗?如果你这样做ptr=new char[10],那么删除使用delete ptr,指针如何知道要删除多少个位置.

Vla*_*lad 16

只有delete运算符,free仅作为函数存在.在C++下,我们鼓励你使用new/ deleteover malloc()/ free().


删除操作符中有一个内部"魔术".使用时创建数组new[],数组的大小存储在内存块的元数据中.delete[]利用这些信息.

所有这些当然都是编译器,OS,优化器和实现相关的.

  • 如果你错误地使用`delete ptr`而不是`delete [] ptr`,那么"魔法"可能会或可能不会正常工作,同样非常依赖于实现. (4认同)
  • 我永远不会理解为什么C++在内部传递数组大小,但是不允许你访问它们,迫使你自己传递数组大小. (3认同)
  • @BlueRaja:如果您创建一个长度为 n 字节的数组,C++ 没有义务为该数组恰好分配 n 个字节——它可以分配更多,例如以确保对齐。 (2认同)

Mat*_*ice 5

如果你做一个非数组类型:

T t = new T;
// ...
delete t;
Run Code Online (Sandbox Code Playgroud)

它会知道要删除多少,因为它知道T有多大.如果你做一个数组:

T t* = new T[10];
// ...
delete [] t;
Run Code Online (Sandbox Code Playgroud)

它会在分配时放下一些额外的信息,告诉它要删除多少.注意,我们使用delete [] t额外的内容[]告诉它它是一个数组.如果你不这样做,它会认为它只是一个T而且只能释放那么多记忆.

delete如果您使用new和使用,请务必free使用malloc.new先做两件事就是分配内存,然后构造对象.类似地delete调用析构函数然后释放内存.malloc\free只处理内存分配和释放.