mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:47:35 +00:00
AK: Fix ref leak in NonnullRefPtr::operator=(T&).
We would leak a ref when assigning a T& to a NonnullRefPtr that already contains that same T.
This commit is contained in:
parent
d9cc3e453c
commit
6db879ee66
3 changed files with 44 additions and 4 deletions
|
@ -131,10 +131,11 @@ public:
|
||||||
|
|
||||||
NonnullRefPtr& operator=(T& object)
|
NonnullRefPtr& operator=(T& object)
|
||||||
{
|
{
|
||||||
if (m_ptr != &object)
|
if (m_ptr != &object) {
|
||||||
deref_if_not_null(m_ptr);
|
deref_if_not_null(m_ptr);
|
||||||
m_ptr = &object;
|
m_ptr = &object;
|
||||||
m_ptr->ref();
|
m_ptr->ref();
|
||||||
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
PROGRAMS = TestString TestQueue TestVector TestHashMap TestJSON TestWeakPtr
|
PROGRAMS = TestString TestQueue TestVector TestHashMap TestJSON TestWeakPtr TestNonnullRefPtr
|
||||||
|
|
||||||
CXXFLAGS = -std=c++17 -Wall -Wextra -ggdb3 -O2 -I../ -I../../
|
CXXFLAGS = -std=c++17 -Wall -Wextra -ggdb3 -O2 -I../ -I../../
|
||||||
|
|
||||||
|
@ -42,6 +42,9 @@ TestJSON: TestJSON.o $(SHARED_TEST_OBJS)
|
||||||
TestWeakPtr: TestWeakPtr.o $(SHARED_TEST_OBJS)
|
TestWeakPtr: TestWeakPtr.o $(SHARED_TEST_OBJS)
|
||||||
$(PRE_CXX) $(CXX) $(CXXFLAGS) -o $@ TestWeakPtr.o $(SHARED_TEST_OBJS)
|
$(PRE_CXX) $(CXX) $(CXXFLAGS) -o $@ TestWeakPtr.o $(SHARED_TEST_OBJS)
|
||||||
|
|
||||||
|
TestNonnullRefPtr: TestNonnullRefPtr.o $(SHARED_TEST_OBJS)
|
||||||
|
$(PRE_CXX) $(CXX) $(CXXFLAGS) -o $@ TestNonnullRefPtr.o $(SHARED_TEST_OBJS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(SHARED_TEST_OBJS)
|
rm -f $(SHARED_TEST_OBJS)
|
||||||
rm -f $(PROGRAMS)
|
rm -f $(PROGRAMS)
|
||||||
|
|
36
AK/Tests/TestNonnullRefPtr.cpp
Normal file
36
AK/Tests/TestNonnullRefPtr.cpp
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#include <AK/TestSuite.h>
|
||||||
|
|
||||||
|
#include <AK/NonnullRefPtr.h>
|
||||||
|
#include <AK/AKString.h>
|
||||||
|
|
||||||
|
struct Object : public RefCounted<Object> {
|
||||||
|
int x;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_CASE(basics)
|
||||||
|
{
|
||||||
|
auto object = adopt(*new Object);
|
||||||
|
EXPECT(object.ptr() != nullptr);
|
||||||
|
EXPECT_EQ(object->ref_count(), 1);
|
||||||
|
object->ref();
|
||||||
|
EXPECT_EQ(object->ref_count(), 2);
|
||||||
|
object->deref();
|
||||||
|
EXPECT_EQ(object->ref_count(), 1);
|
||||||
|
|
||||||
|
{
|
||||||
|
NonnullRefPtr another = object;
|
||||||
|
EXPECT_EQ(object->ref_count(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_EQ(object->ref_count(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(assign_reference)
|
||||||
|
{
|
||||||
|
auto object = adopt(*new Object);
|
||||||
|
EXPECT_EQ(object->ref_count(), 1);
|
||||||
|
object = *object;
|
||||||
|
EXPECT_EQ(object->ref_count(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_MAIN(String)
|
Loading…
Add table
Add a link
Reference in a new issue