【问题标题】:How does delete work? [duplicate]删除如何工作? [复制]
【发布时间】:2011-07-21 21:44:21
【问题描述】:

可能重复:
C programming : How does free know how much to free?

delete 如何知道它需要释放多少字节? 我读到在 new 返回的实际指针地址之前有一些块,其中包含块地址详细信息。

这里有谁知道这个块有多少字节或者那个块的格式是什么?

【问题讨论】:

    标签: c++ memory-management


    【解决方案1】:

    一般来说,这取决于实现。

    这通常实现的方式是 new/malloc 将分配比您要求的稍多的字节,并将使用额外的字节进行一些记账:很多时候分配的块也将在链表中维护,因此额外的字节将用于存储下一个/上一个指针,以及块的大小。

    但是,这不是强制性的。 new/malloc 调用也可以将指针和块的大小存储在地图中。

    如果您对特定实现感兴趣,则必须提供更多信息(例如,您使用的是什么运行时/编译器?)。

    【讨论】:

      【解决方案2】:

      new 运算符和 malloc 函数以它们自己特定的方式处理内存,所以

      • 如果您使用“新”分配内存,则使用“删除”
      • 如果您使用“malloc”分配内存,则使用“free”
      • 如果您不知道如何/谁/在哪里分配了内存,请不要释放它

      如果你一定会尝试弄乱 mallocnew 的内部工作(这似乎是你的目标),那么你做错了 ^ ^

      【讨论】:

        【解决方案3】:

        这个问题没有唯一的正确答案,因为它取决于具体情况。在某些情况下,编译器在编译时就知道对象的大小,因此 delete 知道要释放多少字节。在编译时不知道内存大小的情况下,要么涉及内存映射,要么像您自己建议的那样,在指针前面有一个单词,它告诉分配的字节数。

        我相信其中很多都是特定于实现的,而不是您可以依赖的特定方式。这个问题和one非常相似。

        【讨论】:

        • 您确定“在某些情况下,编译器在编译时知道对象的大小,因此 delete 知道要释放多少字节”部分?我认为这是不可能的,即使是这样,也需要系统两个能够以两种不同的方式在堆上分配东西。
        • @Lindydancer - 嗯,当然可以!这并没有错。例如,sizeof 关键字用于在编译时确定对象的大小。并且编译器根据分配或释放的类型生成不同的代码并不是特别牵强。所有这些都是特定于实现的。
        • @John - 我问的原因是因为我已经编写 C/C++ 编译器 10 多年了,但我从未见过这种情况。由于需要一个特殊的delete 运算符来获取大小(而不是通过指针获取它),编译器必须能够找到对new 的所有调用以及对delete 的相应调用。此指针不得转义并被普通delete 删除,并且此特殊删除不得删除普通指针。您有执行此操作的编译器的具体示例吗?
        • @Lindydancer - 我的 C/C++ 并不完美,但只要你不使用 malloc 分配 objects 就可以了。但是从指针具有特定类型或锁定为具有特定类型的意义上说,C/C++ 并没有真正的类型。我知道您可以使用 RTTI 进行一些类型测试,但我不知道这是否涉及此类对象的实际内存管理。
        • @Lindydancer - 无论哪种方式,RTTI 都与编译时间相反,我想你是对的。 C++ 中的内存管理是明确的,我被托管代码宠坏了太久了。
        猜你喜欢
        • 1970-01-01
        • 2018-05-06
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        相关资源
        最近更新 更多