使用C++实现 malloc

实现教程:https://danluu.com/malloc-tutorial/

说实话,这个大一的应该也能写出来.所以我就不说什么了,直接上代码

#ifndef _MALLOC_H
#define _MALLOC_H
#include <cassert>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <list>
#include <iostream>

class Block
{
  public:
	size_t size = 0;
	bool free = false;
	int debug = 0;
};

const int BLOCK_SIZE = sizeof(Block);
std::list<Block *> mem_list;

Block *RequestSpace(size_t size) //需要处理分配异常
{
	class Block *block;
	block = reinterpret_cast<Block *>(sbrk(0));			//得到当前堆顶部的指针
	void *request = sbrk(size + BLOCK_SIZE);			//sbrk(foo)递增堆大小foo并返回指向堆的上一个顶部的指针
	assert(reinterpret_cast<void *>(block) == request); //不明白这是为什么??
	if (request == reinterpret_cast<void *>(-1))
	{
		throw std::bad_alloc();
		return NULL;
	}
	mem_list.push_back(block); //将其放到链表末尾
	block->size = size;
	block->free = false;
	// block->xxxx = xxx;
	return block;
}
Block *FindFreeBlock(size_t size)
{
	for (auto t : mem_list)
	{
		if ((t->free) && (t->size >= size))
			return t;
	}
	return NULL;
}

void *MyMalloc(size_t size)
{
	if (size <= 0)
		return NULL;
	class Block *block;
	int mem_size = mem_list.size();
	if (mem_size == 0)
	{
		block = RequestSpace(size);
	}
	else
	{
		block = FindFreeBlock(size);
		if (!block) //有空余的空间,但是没有合适的空间可以分配给申请的大小
		{
			block = RequestSpace(size);
		}
		else //找到一块合适的内存块
		{
			block->free = false;
			// block->debug = xxxxxx;
		}
	}
	return (block + 1);
	/*这是为什么?
	答:这是因为他申请内存的时候都是sizeof(Block) + size,所以+1,直接让其指向原始内存 */
}
void *MyCalloc(size_t n, size_t size)
{
	size_t sum_size = n * size;
	void *ptr = MyMalloc(sum_size);
	memset(ptr, 0, sum_size);
	return ptr;
}
class Block *GetBlobkPtr(void *ptr)
{
	return (class Block *)ptr - 1;
}
void MyFree(void *ptr)
{
	if (!ptr)
		return;
	else
	{
		class Block *block_ptr = GetBlobkPtr(ptr);
		assert(block_ptr->free == false);
		block_ptr->free = true;
	}
}
void *MyRealloc(void *ptr, size_t size)
{
	if (!ptr)
	{
		return MyMalloc(size);
	}
	class Block *block = GetBlobkPtr(ptr);
	if (block->size >= size)
		return ptr; //空间足够了
	void *new_ptr = MyMalloc(size);
	memcpy(new_ptr, ptr, block->size);
	MyFree(ptr);
	return new_ptr;
}

#endif

1.其中我不明白的主要是:

assert(reinterpret_cast<void *>(block) == request); //不明白这是为什么??

2.还需要做的是:

(1) 内存对齐
(2) 内存的管理和分配方式(这里就是链表,一不满足就申请)
(3) 块的合并
(4) ....
(5)

考完马原再聊...

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值