delete []指向数组的指针,存储的数组大小的额外4个字节在哪里?

时间:2016-01-17 01:40:29

标签: c++

从教科书中可以看出,当你使用new []分配内存时,编译器将分配额外的4个字节来跟踪数组大小。我想知道额外的4个字节存储在哪里?如何解释以下核心转储?

#include <iostream>
using namespace std;

class A
{
    int m;
};

int main()
{
    A* a = new A[10];
    A* b = a + 3;
    delete[] b;
    delete[] a;
}

2 个答案:

答案 0 :(得分:1)

  

我想知道存储多少4个字节在哪里?

有两种常见的方法。一种是在返回的地址之前存储它。另一种是将它存储在由返回的地址索引的单独的关联容器中。

  

如何解释以下核心转储?

可能你在一个平台上存储了返回地址之前的元素数量。第二个delete[]可能有大小的垃圾。但它失败的确切方式取决于平台,可能发生任何可怕的事情。

答案 1 :(得分:1)

听起来你的教科书很糟糕。

一个切实可行的问题,每个新实现都会增加开销或使用增加开销的函数。这个开销可能是4,8,16,无论字节数。说它的4是不正确的。

总是会在new返回的内存的前面/下面添加开销。但是,许多分配器还会在末尾添加用于检查溢出的内存。

假设开销是4个字节(并且int是4个字节):

int main()
{
    A* a = new A[10];
    A* b = a + 3;
    delete[] b; // 1
    delete[] a; // 2
}

在你的情况下

JSONObject

删除1,尝试删除未由new分配的块。一些新的实现可以解决这个问题。

删除2,尝试在堆被1损坏后删除。