diff options
-rw-r--r-- | intern/guardedalloc/MEM_guardedalloc.h | 18 | ||||
-rw-r--r-- | source/blender/editors/space_outliner/space_outliner.cc | 2 |
2 files changed, 19 insertions, 1 deletions
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 @@ -279,6 +279,24 @@ template<typename T> inline T *MEM_cnew(const char *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<typename T> inline T *MEM_cnew(const char *allocation_name, const T &other) +{ + static_assert(std::is_trivial_v<T>, "For non-trivial types, MEM_new should be used."); + T *new_object = static_cast<T *>(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<SpaceOutliner>(__func__, *space_outliner); + SpaceOutliner *space_outliner_new = MEM_cnew<SpaceOutliner>(__func__, *space_outliner); BLI_listbase_clear(&space_outliner_new->tree); space_outliner_new->treestore = nullptr; |