mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 13:17:44 +00:00
AK: Fix leak in Optional(Optional&&)
We were *copying* the other Optional's value and then marking it as not having a value. This prevented us from ever destroying the original.
This commit is contained in:
parent
9553ecfe01
commit
151e6a1818
2 changed files with 14 additions and 1 deletions
|
@ -29,7 +29,7 @@ public:
|
||||||
: m_has_value(other.m_has_value)
|
: m_has_value(other.m_has_value)
|
||||||
{
|
{
|
||||||
if (m_has_value) {
|
if (m_has_value) {
|
||||||
new (&m_storage) T(move(other.value_without_consume_state()));
|
new (&m_storage) T(other.release_value());
|
||||||
other.m_has_value = false;
|
other.m_has_value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,4 +27,17 @@ TEST_CASE(move_optional)
|
||||||
EXPECT_EQ(x.has_value(), false);
|
EXPECT_EQ(x.has_value(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE(optional_leak_1)
|
||||||
|
{
|
||||||
|
struct Structure {
|
||||||
|
Optional<String> str;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This used to leak, it does not anymore.
|
||||||
|
Vector<Structure> vec;
|
||||||
|
vec.append({ "foo" });
|
||||||
|
EXPECT_EQ(vec[0].str.has_value(), true);
|
||||||
|
EXPECT_EQ(vec[0].str.value(), "foo");
|
||||||
|
}
|
||||||
|
|
||||||
TEST_MAIN(Optional)
|
TEST_MAIN(Optional)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue