嵌入式指针(allocator3)

 3 版本分开了分配器于具体对象的实现 使用者不必关心allocaotr的具体实现过程

#pragma once
#include<stdlib.h>
namespace my_alloctor3 {
	class allocator
	{
	public:
		void* allocate(size_t );
		void deallocate(void* , size_t );
	private:
		struct obj {
			struct obj* next;
		};
	private:
		const int BLOCK_SIZE = 5;
		obj* freeStore = nullptr;
	};

	void* allocator::allocate(size_t size)
	{
		obj* p;
		if(!freeStore)
		{
			size_t chunk = size * BLOCK_SIZE;
			freeStore = p =
				(obj*)malloc(chunk);

			for (int i = 0; i < BLOCK_SIZE - 1; ++i)
			{
				p->next = (obj*)((char*)p+size);
				p = p->next;
			}
			p->next = nullptr;
		}
		p = freeStore;
		freeStore = freeStore->next;
		return p;
	}
	void allocator::deallocate(void* pdead, size_t size)
	{
		((obj*)pdead)->next = freeStore;
		freeStore = (obj*)pdead;
	}
}

主函数以及自定义类实现

#include"allocator3.h"
#include<iostream>
using namespace std;

class A
{
public:
	long L;
	char c;
	int i = 0;
	static my_alloctor3::allocator my_Alloc;
public:
	A(int a):i(a){}
	static void * operator new(size_t size)
	{
		return my_Alloc.allocate(size);
	}
	static void operator delete(void* pdead, size_t size)
	{
		return my_Alloc.deallocate(pdead, size);
	}
};
my_alloctor3::allocator A::my_Alloc;
int main()
{
	A* p[100];
	cout << sizeof(A) << endl;
	for (int i = 0; i < 23; i++)
	{
		p[i] = new A(i);
		cout << p[i]->i << " "<< p[i] << endl;
	}
	for (int i = 0; i < 23; i++)
		delete p[i];
	return 0;
}

  • 3
    点赞
  • 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
发出的红包

打赏作者

DyingLive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值