2016-11-02 105 views
4

在C++中,当我们分配一个数组时,在初始化数组后,无法找到数组的大小。那么当我试图在程序结束时释放内存时,删除操作符如何知道要删除的内存量?在C++中删除数组时释放内存

int main() 
{ 
    int* p = new int[10]; 
    int* q = new int[30]; 
    //... bunch of code 
    //... 
    // ... bunch of code 
    delete[] p; 
    delete[] q; 
    return 0; 
} 
+0

这一切都由您的编译器和/或C++库处理。足以说正确的事情会发生。 –

+2

简短的回答是“然而它想要”。 –

+0

https://isocpp.org/wiki/faq/freestore-mgmt#num-elems-in-new-array – melpomene

回答

12

new运营商最终建立在堆上的条目,并且堆分配器知道如何去分配它以前分配的事情。这些信息通常不可用于您的代码,因为它是您不应该混淆的所有C++内部信息。

所以基本上堆的元数据描述了这种分配。

请记住,在C++中,您可以write your own allocator,因此如果您愿意,newdelete[]可能最终与该接口连接。如果你看看std::allocator是如何定义的,请注意,你没有义务告诉任何人已经做了什么分配,也没有必要告诉任何特定分配有多大。分配器在这里拥有巨大的自由度,并且规范不允许大量的询问。

+0

分配器感知的容器调用的分配器特性的释放函数实际上会带有一个大小以及一个指针,它是应该代表先前分配的大小。因此,要一般使用分配器,您有义务以某种方式跟踪您自己的堆请求大小并将其传回。所以它与新的和删除的情况完全不同。 –