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没有赋值为空,找到初始化内存块区域。