diff --git a/intern/guardedalloc/MEM_guardedalloc.h b/intern/guardedalloc/MEM_guardedalloc.h index d8a8c1181e4..8cd2c9f94dd 100644 --- a/intern/guardedalloc/MEM_guardedalloc.h +++ b/intern/guardedalloc/MEM_guardedalloc.h @@ -278,6 +278,24 @@ template inline T *MEM_cnew(const char *allocation_name) return static_cast(MEM_callocN(sizeof(T), allocation_name)); } +/** + * Allocate memory for an object of type #T and copy construct an object from `other`. + * Only applicable for a trivial types. + * + * This function works around problem of copy-constructing DNA structs which contains deprecated + * fields: some compilers will generate access deprecated field in implicitly defined copy + * constructors. + * + * This is a better alternative to #MEM_dupallocN. + */ +template inline T *MEM_cnew(const char *allocation_name, const T &other) +{ + static_assert(std::is_trivial_v, "For non-trivial types, MEM_new should be used."); + T *new_object = static_cast(MEM_mallocN(sizeof(T), allocation_name)); + memcpy(new_object, &other, sizeof(T)); + return new_object; +} + /** * Destructs and deallocates an object previously allocated with any `MEM_*` function. * Passing in null does nothing. diff --git a/source/blender/editors/space_outliner/space_outliner.cc b/source/blender/editors/space_outliner/space_outliner.cc index f75182d25a0..97dc659155f 100644 --- a/source/blender/editors/space_outliner/space_outliner.cc +++ b/source/blender/editors/space_outliner/space_outliner.cc @@ -371,7 +371,7 @@ static void outliner_init(wmWindowManager *UNUSED(wm), ScrArea *area) static SpaceLink *outliner_duplicate(SpaceLink *sl) { SpaceOutliner *space_outliner = (SpaceOutliner *)sl; - SpaceOutliner *space_outliner_new = MEM_new(__func__, *space_outliner); + SpaceOutliner *space_outliner_new = MEM_cnew(__func__, *space_outliner); BLI_listbase_clear(&space_outliner_new->tree); space_outliner_new->treestore = nullptr;