87 lines
1.7 KiB
C++
87 lines
1.7 KiB
C++
#include "Tool/RefObject.h"
|
||
|
||
RefObject::RefObject()
|
||
: ref_count_(0) // 修正:新创建对象引用计数应为1
|
||
{
|
||
}
|
||
|
||
RefObject::~RefObject() {}
|
||
|
||
void RefObject::Retain()
|
||
{
|
||
// 修正:使用fetch_add确保原子操作
|
||
ref_count_.fetch_add(1, std::memory_order_relaxed);
|
||
}
|
||
|
||
void RefObject::Release()
|
||
{
|
||
// 修正:使用fetch_sub确保原子操作并检查结果
|
||
if (ref_count_.fetch_sub(1, std::memory_order_acq_rel) == 1)
|
||
{
|
||
delete this;
|
||
}
|
||
}
|
||
|
||
uint32_t RefObject::GetRefCount() const
|
||
{
|
||
return ref_count_.load(std::memory_order_relaxed);
|
||
}
|
||
|
||
void *RefObject::operator new(size_t size)
|
||
{
|
||
void *ptr = memory::Alloc(size);
|
||
if (!ptr)
|
||
{
|
||
throw std::bad_alloc();
|
||
}
|
||
return ptr;
|
||
}
|
||
|
||
void RefObject::operator delete(void *ptr)
|
||
{
|
||
if (ptr) // 增加空指针检查
|
||
{
|
||
memory::Free(ptr);
|
||
}
|
||
}
|
||
|
||
// 修正:添加noexcept说明符,与声明一致
|
||
void *RefObject::operator new(size_t size, std::nothrow_t const &) noexcept
|
||
{
|
||
try
|
||
{
|
||
return memory::Alloc(size);
|
||
}
|
||
catch (...)
|
||
{
|
||
return nullptr;
|
||
}
|
||
}
|
||
|
||
// 修正:添加noexcept说明符,与声明一致
|
||
void RefObject::operator delete(void *ptr, std::nothrow_t const &) noexcept
|
||
{
|
||
if (ptr) // 增加空指针检查
|
||
{
|
||
try
|
||
{
|
||
memory::Free(ptr);
|
||
}
|
||
catch (...)
|
||
{
|
||
// 忽略异常,符合noexcept语义
|
||
}
|
||
}
|
||
}
|
||
|
||
// 修正:添加noexcept说明符,与声明一致
|
||
void *RefObject::operator new(size_t size, void *ptr) noexcept
|
||
{
|
||
return ::operator new(size, ptr);
|
||
}
|
||
|
||
void RefObject::operator delete(void *ptr, void *place) noexcept
|
||
{
|
||
::operator delete(ptr, place);
|
||
}
|