From 688e4b36f5435b66107674be83d3370246798c14 Mon Sep 17 00:00:00 2001 From: tushicheng <18829573815@163.com> Date: Tue, 12 Dec 2023 10:13:08 +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 5295b2547e..a049aa222a 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 559c7dd921..f90337b322 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) {