内存池链表逻辑

1.上一个链表节点的next指向下一个节点,
当前的链表节点的next必须为空

MemoryBlock* _pTempbefore = _pHeader;
for (size_t i = 1; i < _nBlockSize; i++)
		{
			//第二块开始后开始储存数据
			MemoryBlock* pTemp = (MemoryBlock*)(_pBuf + (i * (_nSize + sizeof(MemoryBlock))));
			pTemp->bPool = true;
			pTemp->nID = i;
			pTemp->nRef = 0;
			pTemp->pAlloc = this;
			pTemp->pNext = nullptr;
			//_pTempbefore->pNext=nullptr;
			_pTempbefore->pNext = pTemp;
			//储存了这次数据块的头位置,在下次循环的时候,就会成为上一个节点的位置,
			//这样用上一块的pNext就可以连接这一次的内存块,形成一个链表
			_pTempbefore = pTemp;
		}

之前误把pTemp->pNext = nullptr;写成_pTempbefore->pNext=nullptr;导致当前的内存块的next没有赋为空,而内存池中,最后一个内存块的next为空,是判断内存池耗尽的重要判定依据,而pTemp->pNext没有给null后,系统就会给pNext随机赋值,不为空。导致判断出错。

if (nullptr == _pHeader)
		{
			//sizeof(MemoryBlock)内存信息的空间,用来储存储存快的属性
			//size是申请空间的大小
			pReturn = (MemoryBlock*)malloc(size + sizeof(MemoryBlock));
			//单独申请的内存块,不在内存池中
			pReturn->bPool = false;
			pReturn->nID = -1;
			pReturn->nRef = 1;
			pReturn->pAlloc = nullptr;
			pReturn->pNext = nullptr;

		}
		else//池中有空间,在池中
		{
		//1.一开始是检测到_pHeader无法访问pHeader数据
			pReturn = _pHeader; //******
			
			_pHeader = pReturn->pNext;
			//assert里判断的消息如果为假就报错
			assert(0 == pReturn->nRef);//不为0就报错
			pReturn->nRef = 1;//增加一下引用次数
		}

1.一开始是检测到_pHeader无法访问pHeader数据.
2.在发现因为没有给_pHeader判空而在,内存池用完后,仍然使用内存池中的内存块赋值。因为已经没有内存,而且没有开辟内存而出错;
3.这个时候查找最后一个header的pheader的定义,是pReturn-next赋值,查找pheader,发现是从header指1,1指2,2指3,发现应该是在初始化内存块赋值的时候,最后一块的next没有赋值为空,找到初始化内存块区域。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值