代码之家  ›  专栏  ›  技术社区  ›  BeeOnRope

可以用realloc安全地重新分配可复制对象的存储吗?

  •  8
  • BeeOnRope  · 技术社区  · 8 年前

    我知道 trivially copyable 可以安全地复制对象 malloc 1. 并且目标对象将与源对象具有相同的值。

    这也可能与 realloc ? 也就是说,如果 realloc公司 一些存储包含一些类型的对象 T


    1. 在问这个问题时,我假设“适当的存储位置”包括适当对齐和大小的未初始化存储,但作为 M.M's answer 下文认为,这实际上并没有得到标准的很好支持。这将使 realloc公司 有问题,因为它总是复制到未初始化的存储中。

    2 回复  |  直到 8 年前
        1
  •  9
  •   BeeOnRope    8 年前

    , realloc 无法用于安全移动对象,即使是可复制的类型,因为 realloc公司 无法在未初始化的存储中创建新对象。

    特别是,根据C++14[basic.life]/1:

    T型对象的寿命在以下情况下结束:

    • 对象占用的存储被重用或释放。

    使命感 释放或重用存储(即使没有发生重新分配,我认为,尽管这对你的问题没有意义)。因此,对象的生命周期结束。

    [intro.objects]/1涵盖了创建对象的情况:

    对象由定义(3.1)和新表达式(5.3.4)创建 或在需要时通过实施(12.2)。

    这不包括 realloc公司 ; 因此,realloc调用结束了旧对象的生存期,并且不会创建新对象。

    这不仅意味着 realloc公司 不适合复制微不足道的可复制对象,这还意味着使用 malloc operator new(size_t) 获取未初始化的存储,然后是 memcpy 创建 那样的话


    另请参见: reinterpret_cast creating a trivially-default-constructible object constructing a trivially copyable object with memcpy 进一步讨论将字节复制到新位置不会在该位置创建对象。

        2
  •  -3
  •   Community Mohan Dere    6 年前

    3.8对象寿命 很清楚:

    T型对象的寿命始于:

    1.1获得T型的适当对齐和尺寸的存储,以及

    1.2如果对象具有非真空初始化,则其初始化完成。

    和生命结束时一样。你可以忽略std其他部分的垃圾,比如[简介]!