Files
mir_server/Gateway/srvlib/include/memory/base_allocator.hpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

91 lines
1.9 KiB
C++

#ifndef _BASE_ALLOCATOR_H_
#define _BASE_ALLOCATOR_H_
/************************************************************************
* 内存分配器的基类,其他分配器可继承其接口,实现不同的内存分配算法
* 这个基类实现的内存分配就是直接用crt分配内存
************************************************************************/
#include "os_def.h"
#include "memory_counter.hpp"
#ifdef _MEMORY_TRACE_
#define AllocBuffer(count_) _AllocBuffer(count_,__FILE__, __LINE__)
#define ReAllocBuffer(src,count_) _ReAllocBuffer(src,count_,__FILE__, __LINE__)
#define FreeBuffer(ptr) _FreeBuffer(ptr, __FILE__, __LINE__)
#endif
class BaseAllocator : public AllocatorCounterItem
{
public:
#ifndef _MEMORY_TRACE_
virtual void* AllocBuffer(size_t count)
#else
virtual void* _AllocBuffer(size_t count, const char*, int)
#endif
{
size_t* result = (size_t*)malloc(count + sizeof(size_t));
#ifdef _MEMORY_TRACE_
if (result != NULL)
{
alloc_total_ += count;
*result = count;
}
#endif
return (void*)(result + 1);
}
#ifndef _MEMORY_TRACE_
virtual void* ReAllocBuffer(void* src, size_t count)
#else
virtual void* _ReAllocBuffer(void* src, size_t count, const char*, int)
#endif
{
#ifdef _MEMORY_TRACE_
if (src)
{
size_t old = *((size_t*)src - 1);
alloc_total_ -= old;
src = (void*)((size_t*)src - 1);
}
alloc_total_ += count; // 注意是size_t类型
#endif
size_t* result = (size_t*)realloc(src, count + sizeof(size_t));
*result = count;
return (void*)(result + 1);
}
#ifndef _MEMORY_TRACE_
virtual void FreeBuffer(void* ptr)
#else
virtual void _FreeBuffer(void* ptr, const char*, int)
#endif
{
if (!ptr) return;
#ifdef _MEMORY_TRACE_
size_t old = *((size_t*)ptr - 1);
alloc_total_ -= old;
#endif
free((size_t*)ptr - 1);
}
BaseAllocator(const char* namestr) : AllocatorCounterItem(namestr)
{
}
virtual ~BaseAllocator()
{
}
void SetMultiThread(bool){}
void GC()
{
}
};
#endif //end _BASE_ALLOCATOR_H_