C ++: Memcpy для POD основанный подобъект UB? - PullRequest
2 голосов
/ 28 апреля 2020

Давайте go к коду:

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, это хотя бы переносимо среди основных компиляторов? (g cc, clang, intel, et c).

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Да, я знаю ..., это уродливо, но не спрашивайте, зачем мне это нужно это.

1 Ответ

1 голос
/ 02 мая 2020

Правило довольно однозначно. [basi c .types] / 3 (выделение добавлено, сноска опущена):

Для любого тривиально копируемого типа T, если два указателя на T указывают для различающихся T объектов obj1 и obj2, , где ни obj1, ни obj2 не является потенциально перекрывающимся подобъектом , если нижележащие байты ([intro.memory]) составляют obj1 копируются в obj2, obj2 впоследствии должны содержать то же значение, что и obj1.

Субъекты базового класса являются потенциально перекрывающимися подобъектами. что стандарт не определяет, какое будет результирующее значение, если вы memcpy в подобъекте базового класса.

Что не так с простым присваиванием?

...