C++:memcpy对基于POD的子对象UB吗?

问题描述 投票:2回答:1

我们来看看代码。

extern "C" {
#include "pod-struct-T.h"
#include "malloc-and-initialize-one-T.h"
}

struct TCpp : T
{
   TCpp()
   {
      T* ptr_t = malloc_and_initialize_one_T();
      T* this_t = static_cast<T*>(this);
      std::memcpy(this_t, ptr_t, sizeof(T));
      free(ptr_t);
   }
};

在这段代码中,有多少个UB(对于C++03和C++11;或者对于C++20,如果它的内存模型重新审视后有变化的话),或者这样做: memcpy 是就好了?如果是UB,至少在主要的编译器中是可移植的吗?(gcc, clang, intel等)。

免责声明: 是的,我知道......,它很丑陋,但不要问我为什么要这样做。

c++ c++11 inheritance malloc language-lawyer
1个回答
1
投票

这个规则很不明确。[basic. types]3 (强调是后加的,脚注省略)。

对于任何可琐碎复制的类型 T,如果有两个指针指向 T 指明 T 对象 obj1obj2, 其中既不 obj1 也不 obj2 是一个潜在的重叠子对象。,如果基本字节([intro.memory])构成了 obj1 被复制到 obj2, obj2 随后应保持与 obj1.

基类子对象是潜在的重叠子对象。 由此可见,标准并没有定义如果你的对象是 memcpy 变成一个基类子对象。

简单赋值有什么不好?

© www.soinside.com 2019 - 2024. All rights reserved.