gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:27 25 4
gpt4 key购买 nike

这是我一直想知道但从未找到答案的问题:

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

这和它在堆上的存储方式有关系吗?此信息是否存在但未被 C++ 公开?

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

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

最佳答案

当进行分配时,紧接在[或者,技术上,在完全不同的地方,但在最常见的情况下]之前的一小段内存将存储分配的大小,并且在 的情况下new [] 还存储分配对象的数量。

请注意,C++ 标准没有给出任何检索此信息的方法是有原因的:它可能无法准确描述分配的内容,例如,数组的大小很可能会四舍五入到某个“不错”的边界[几乎所有现代分配器都至少舍入到 16 字节,因此内存可用于 SSE 和其他处理器架构上的其他类似 SIMD 实现]。因此,如果您分配了 40 个字节,它会返回 48 个字节,这不是您所要求的,因此会很困惑。当然,不能保证所有信息都已存储——它可能由存储在分配的“admin” block 中的其他一些信息暗示。

当然,您可以使用放置 new,在这种情况下没有管理 block ,并且不会以正常方式删除分配 - 一些任意代码无法分辨区别。

deletedelete [] 的不同之处在于 delete [] 将知道分配了多少对象,并为所有对象调用析构函数那些对象。 new [] 也有可能 [甚至可能] 以某种方式存储元素的数量,这意味着调用 delete [] 不是用new [] 会出错。

正如 Zan Lynx 评论的那样,如果对象没有析构函数(例如,当您为 intstruct { int x; double y; } 等 - 包括没有构造函数的类 [但是请注意,如果类中有另一个类,编译器将为你构建一个析构函数]),则无需存储计数或执行任何操作否则,编译器可以根据需要将这种分配优化为常规 newdelete

关于C++ 运行时动态内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26411637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com