[CP] fix the memleak of nested Array

This commit is contained in:
obdev 2024-02-07 16:53:28 +00:00 committed by ob-robot
parent c699ceea48
commit 540f23b2d3
2 changed files with 36 additions and 2 deletions

View File

@ -1057,15 +1057,23 @@ inline void set_member_allocator(T &dest, common::ObIAllocator *alloc)
template <typename T>
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 <typename T>
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<HAS_MEMBER(T, get_copy_assign_ret)>());
if (OB_FAIL(get_copy_assign_ret_wrap(dest, BoolType<HAS_MEMBER(T, get_copy_assign_ret)>()))) {
dest.~T();
}
return ret;
}
// This function is used for copy assignment

View File

@ -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)
{