建档
This commit is contained in:
86
source/Tool/RefObject.cpp
Normal file
86
source/Tool/RefObject.cpp
Normal file
@@ -0,0 +1,86 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user