delete []如何知道数组的大小?

Luc*_*cas 11 c++

我很好奇delete []如何计算分配内存的大小.当我做的事情:

int* table = new int[5];
delete[] table;
Run Code Online (Sandbox Code Playgroud)

我明白表的内存是释放的.但是,如果我将指针重新分配给某个不同的表,会发生什么.

int* table = new [5];
int* table2 = new [9];
table = table2;
delete[] table;
Run Code Online (Sandbox Code Playgroud)

我可以免费使用5或9号桌子吗?我对new []和delete []如何共享有关其大小的信息感兴趣.或许我错过了一些必不可少的东西.

Dou*_* T. 16

C++ FAQ lite的第16.14节回答了这个问题:

有两种流行的技术可以做到这一点.这两种技术都被商业级编译器使用,两者都有权衡,而且都不是完美的.这些技术是:

* Over-allocate the array and put n just to the left 
  of the first Fred object.
* Use an associative array with p as the key and n as the value.
Run Code Online (Sandbox Code Playgroud)


jal*_*alf 13

它会删除一个大小为9的数组.它会删除指针指向的数组.

未指定如何存储大小信息,因此每个编译器可以以不同的方式实现它,但是常见的方法是在数组之前分配额外的块.也就是说,当你这样做时:

int* table = new int[5];
Run Code Online (Sandbox Code Playgroud)

它实际上分配了一个由6个整数组成的数组,并将数组大小存储在第一个元素中.然后它返回指向第二个元素的指针.所以要找到大小,删除[]只需要读表[-1],基本上.

这是一种常用的方法,但语言标准没有规定必须以这种方式完成.只是它必须工作.

另一种方法可能是将数组的地址用作某个全局哈希表的键.任何方法都有效,只要它产生正确的结果.