运行时动态内存的C++大小

Mat*_*att 6 c++ memory heap allocation dynamic

这是我一直想知道的事情,从来没有找到答案:

为什么当你在堆上分配一些东西时,你无法仅通过指针来确定它的大小,但是你可以仅使用指针来删除它,不知何故C++知道要释放多少字节?

这与它在堆上的存储方式有关吗?这些信息是否存在但C++没有公开?

也许这应该是一个单独的问题,但我认为它非常相关所以我会在这里问:

为什么必须使用delete []简单的delete命令来删除动态的元素数组; 为什么C++需要这些额外的信息才能正确释放所有内存?

Mat*_*son 5

当进行分配时,紧接在[或者,技术上,某处完全不同,但恰好在最常见的情况之前]的一小部分内存将存储分配的大小,并且在new []存储分配的数量的情况下也是如此.对象.

请注意,C++标准没有提供任何方法来检索此信息,原因如下:它可能无法准确描述分配的内容,例如,数组的大小可能会被四舍五入到一些"漂亮"的边界[几乎所有现代分配器至少舍入到16个字节,因此内存可用于其他处理器体系结构上的SSE和其他类似的SIMD实现].因此,如果您分配了40个字节,它将报告48,这不是您要求的,所以它会相当混乱.当然,不能保证信息存储在ALL中 - 它可能隐含在存储在分配的"admin"块中的其他一些信息中.

当然,您可以使用展示位置new,在这种情况下,没有管理块,并且不会以正常方式删除分配 - 某些任意代码无法区分.

delete不同之处delete []在于delete []将知道已分配了多少个对象,并为所有这些对象调用析构函数.也有可能[甚至可能] new []以一种方式存储元素的数量,这意味着调用delete []未创建的东西new []会出现可怕的错误.

而作为咱山猫评论,如果没有为对象的析构函数没有(例如,当你在分配数据intstruct { int x; double y; }等-包括不具有构造函数[注但是类,如果你有在类中另一个类中,编译器会为你构建一个析构函数]),然后就不需要存储计数,或者做任何其他事情,所以编译器CAN,如果愿意,可以将这种分配优化为常规newdelete.