delete []如何知道要删除多少内存?

时间:2014-02-24 09:38:56

标签: c++ delete-operator

int* i = new int[4];
delete[] i;
  1. 当我们调用delete []时,程序如何知道“i”是4字节长度。 4是存储在内存中的某个地方吗?
  2. delete []的实现取决于系统或编译器?
  3. 是否有一些系统API来获取i?
  4. 的长度

    正如HadeS所说,它将保存已分配多少内存的信息?在哪里? 它必须保存在内存中,或者可能在指针i附近。

2 个答案:

答案 0 :(得分:5)

首先,i不是" 4字节长度"。相反,i是指向四个整数数组的指针。

接下来,delete[]不需要知道任何事情,因为int没有析构函数。所有必须发生的事情是需要释放内存,这是由系统的分配器完成的。这与free(p)的情况相同 - 您不需要告诉free需要释放多少内存,因为您希望它能够解决这个问题。

需要调用析构函数时情况不同;在这种情况下,C ++实现确实需要分别记住C ++对象的数量。虽然许多编译器遵循流行的Itanium ABI,但它允许将这些不同编译器编译的目标代码链接在一起,所以这个方法取决于实现。

您无法查询此信息。您应该将动态数组视为C ++的错误;基本上没有理由使用它们*,并且你总是可以通过某种类别来管理内存和对象分别和单独地做得更好:既然你必须记住数组元素的数量,那么它就是'更好地将大小和分配封装在一个连贯的类中,而不是在没有传递额外信息的情况下使用模糊的动态数组,除非你有自我终止的语义,但是你只需要使用额外的空间作为终结者。)

*)至少有两个关于动态数组的标准缺陷,没有人太担心修复

答案 1 :(得分:0)

动态分配内存时;编译器会根据您的要求分配一个额外的内存块,它将保存信息how much memory has been allocated。 当您尝试使用delete删除此内存时,编译器将读取这个额外的内存块,以查看分配了多少内存并相应地释放空间。

我认为没有任何API可以获取此信息。