From 540f23b2d32c868f702215bac31d62735f9d43e7 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 7 Feb 2024 16:53:28 +0000 Subject: [PATCH] [CP] fix the memleak of nested Array --- deps/oblib/src/lib/utility/utility.h | 12 +++++++-- .../unittest/lib/utility/test_utility.cpp | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/deps/oblib/src/lib/utility/utility.h b/deps/oblib/src/lib/utility/utility.h index 5295b2547..a049aa222 100644 --- a/deps/oblib/src/lib/utility/utility.h +++ b/deps/oblib/src/lib/utility/utility.h @@ -1057,15 +1057,23 @@ inline void set_member_allocator(T &dest, common::ObIAllocator *alloc) template inline int construct_assign_wrap(T &dest, const T &src, TrueType) { + int ret = OB_SUCCESS; new(&dest) T(); - return dest.assign(src); + if (OB_FAIL(dest.assign(src))) { + dest.~T(); + } + return ret; } template inline int construct_assign_wrap(T &dest, const T &src, FalseType) { + int ret = OB_SUCCESS; new(&dest) T(src); - return get_copy_assign_ret_wrap(dest, BoolType()); + if (OB_FAIL(get_copy_assign_ret_wrap(dest, BoolType()))) { + dest.~T(); + } + return ret; } // This function is used for copy assignment diff --git a/deps/oblib/unittest/lib/utility/test_utility.cpp b/deps/oblib/unittest/lib/utility/test_utility.cpp index 559c7dd92..f90337b32 100644 --- a/deps/oblib/unittest/lib/utility/test_utility.cpp +++ b/deps/oblib/unittest/lib/utility/test_utility.cpp @@ -18,6 +18,32 @@ using namespace oceanbase::common; using namespace std; +struct TestItem +{ + TestItem() : status_(0), disable_assign_(false) + {} + ~TestItem() + { + status_ = 1; + } + int assign(const TestItem &other) + { + return other.disable_assign_ ? OB_ERROR : OB_SUCCESS; + } + int status_; + bool disable_assign_; +}; + +TEST(utility, construct_assign) +{ + TestItem item_1, item_2; + item_1.disable_assign_ = true; + TestItem *item = (TestItem *)ob_malloc(sizeof(TestItem), "TEST"); + construct_assign(*item, item_1); + ASSERT_EQ(1, item->status_); + construct_assign(*item, item_2); + ASSERT_EQ(0, item->status_); +} TEST(utility, load_file_to_string) {