从教科书中可以看出,当你使用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;
}
答案 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损坏后删除。