memcpy 是否保留了琐碎对象的有效性?



如果有一个平凡类型的有效对象(在这种情况下,平凡类型满足平凡移动/复制可构造概念(,并且memcpy将其分配到未初始化的内存区域,则复制的内存区域是有效对象吗?

根据我所读到的假设:一个对象只有在它的构造函数被调用时才有效。

将具有std::memcpy的平凡类型的对象复制到大小合适且对齐的存储中,将在该位置隐式地开始新对象的生存期。

有一类类型称为隐式生存期类型,其要求是:

  • 标量类型,或
  • 数组类型,或
  • 聚合类类型,或
  • 一个类类型,该类至少有一个平凡的合格构造函数
    • ,并且
    • 一个琐碎的、未删除的析构函数,
  • 或上述类型之一的cv合格版本

琐碎的类类型满足这些要求。

隐式生存期类型的对象具有这样的特性,即它们的生存期可以通过几个函数或操作隐式启动:

开始类型为charunsigned charstd::byte的数组的生存期的
  • 操作(由于C++17(,在这种情况下,在数组中创建这样的对象
  • 调用以下分配函数,在这种情况下,这些对象
    • 在分配的存储中创建:
    • 操作员新
    • 操作员新[]
    • std::malloc
    • std::calloc
    • std::realloc
    • std::aligned_alloc(从C++17开始(
  • 调用以下对象表示复制函数,在这种情况下,这些对象是在存储或结果的目标区域中创建的:
    • 标准::memcpy
    • std::memmove
    • std::bit_cast(从C++20开始(

最新更新