一、学到的知识
- Allocator 的具体实现
主要实现Allocate
和Deallocate
方法,Construct 和 Destory 方法已被最新的C++20所弃用。
使用 Allocator 的好处是:将内存分配和释放的逻辑解耦,隐藏了细节,可以自定义具体的内存使用逻辑,容器只需要调用对应的接口 - 复习
operator new
和operator delete
template
函数需要在 .h 文件定义并实现,否则编译器将不知道它的具体类型,编译具体代码时就会失败。
二、代码
非完整项目代码
Allocator.h
/**
* @brief 学习C++
* @author Moota
* @Date 2023-02-21
*/
#pragma once
#include "../../../../Core/Base/Object.h"
#include "../../../../Core/Base/Data.h"
/**
* @brief 内存分配器,用于容器的内存分配
*/
template <typename ElementType>
class FAllocator : public UObject
{
private:
// 内存大小
SizeType Size = 0;
// 内存指针
ElementType* Pointer = nullptr;
public:
/**
* @brief 为指定个数的元素分配内存
* @param Number 元素个数
* @return 分配好内存的指针
*/
ElementType* Allocate(SizeType Number);
/**
* @brief 回收分配的内存空间
*/
void Deallocate();
/**
* @brief 获得已分配的内存大小
* @return 内存大小
*/
SizeType GetSize() const
{
return Size;
}
};
template <typename ElementType>
ElementType* FAllocator<ElementType>::Allocate(SizeType Number)
{
const SizeType NewSize = Number * sizeof(ElementType);
Pointer = static_cast<ElementType*>(::operator new(NewSize));
Size = NewSize;
return Pointer;
}
template <typename ElementType>
void FAllocator<ElementType>::Deallocate()
{
::operator delete(Pointer);
Size = 0;
}