C++-自定义Allocator实现

一、学到的知识

  1. Allocator 的具体实现
    主要实现 AllocateDeallocate 方法,Construct 和 Destory 方法已被最新的C++20所弃用。
    使用 Allocator 的好处是:将内存分配和释放的逻辑解耦,隐藏了细节,可以自定义具体的内存使用逻辑,容器只需要调用对应的接口
  2. 复习 operator newoperator delete
  3. 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vector allocatorC++ STL库中vector容器的一个模板参数,用于指定容器的内存分配器。默认情况下,vector使用std::allocator作为其内存分配器,该分配器使用new和delete来分配和释放内存。 使用自定义allocator可以实现对内存分配和释放的控制,以满足特定的需求。自定义allocator必须满足allocator的要求,包括定义了一些成员函数,如allocate、deallocate、construct和destroy等。 下面是一个使用自定义allocator的示例: ```cpp #include <iostream> #include <vector> // 自定义allocator template <typename T> class MyAllocator { public: using value_type = T; T* allocate(std::size_t n) { std::cout << "Allocating memory for " << n << " elements" << std::endl; return new T[n]; } void deallocate(T* p, std::size_t n) { std::cout << "Deallocating memory for " << n << " elements" << std::endl; delete[] p; } template <typename... Args> void construct(T* p, Args&&... args) { new (p) T(std::forward<Args>(args)...); } void destroy(T* p) { p->~T(); } }; int main() { // 使用自定义allocator std::vector<int, MyAllocator<int>> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); for (const auto& num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; } ``` 运行上述代码,输出结果为: ``` Allocating memory for 1 elements Allocating memory for 2 elements Allocating memory for 3 elements 1 2 3 Deallocating memory for 3 elements Deallocating memory for 2 elements Deallocating memory for 1 elements ``` 该示例中,我们定义了一个名为MyAllocator自定义allocator,并将其作为vector的第二个模板参数。在自定义allocator中,我们重载了allocate、deallocate、construct和destroy等函数,以实现自定义的内存分配和释放逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值