利用模板化的空闲块列表克服内存碎片问题

    闲来无事,看看游戏精粹。

    频繁的分配和删除操作可能会造成许多内存碎片。可能会造成有可以满足程序的内存请求,但却没有足够大的连续的内存块,这样游戏效率很低。

    另一个副作用就是低的访问局部性。

   下面是一个解决方法的代码:

   #include<assert.h>

  template<class DataType>

class MemoryAlloc{

public: MemoryAlloc(int Num);

~MemoryAlloc();

private:

 MemoryAlloc(MemoryAlloc&otherM);

MemoryAlloc& operator=(MemoryAlloc&);

public: 

 DataType*NewADataType(); 

 void DeleteDataType(DataType* PData);

protected:
void FreeAll();
DataType * m_PData;

 DataType**m_PPData;
int DataBlockNum;

int CurrDataBlockTop;

};


template<class DataType>

MemoryAlloc<DataType>::MemoryAlloc(int Num)

{

DataBlockNum = Num;   

FreeAll(); 

};
template<class DataType>

MemoryAlloc<DataType>::~MemoryAlloc()

{

if(m_PData)

delete []m_PData;

if(m_PPData)

delete []m_PPData;

}

template<class DataType>

void MemoryAlloc<DataType>::FreeAll()

{

assert(DataBlockNum>0);

m_PData = new DataType[DataBlockNum]; 

  m_PPData= new DataType*[DataBlockNum];

    assert(m_PData);

assert(m_PPData);

int ITemp = DataBlockNum;

for(CurrDataBlockTop=0;CurrDataBlockTop<DataBlockNum;CurrDataBlockTop++)

{   

  m_PPData[CurrDataBlockTop] = &(m_PData[--ITemp]);

}

}
template<class DataType>

DataType*MemoryAlloc<DataType>::NewADataType()

assert(CurrDataBlockTop);

return m_PPData[--CurrDataBlockTop];
}

template<class DataType>

void MemoryAlloc<DataType>::DeleteDataType(DataType* PData)

{

assert( (PData >= &(m_PData[0])) && (PData <= &(m_PData[DataBlockNum-1])));

   assert(CurrDataBlockTop<DataBlockNum); //至少有空位 

 m_PPData[CurrDataBlockTop++]  = PData;

}

下面是测试代码:

int main()

{

MemoryAlloc<int> a(100);

vector<int *> b(100); 

    for(int i =0 ; i<100;i++)

{     

b[i]= a.NewADataType();

  }

for(int i =0 ; i<100;i++)

{  

a.DeleteDataType(b[i]);

}

b.clear();

b.swap(vector<int*>());

return 0;

}

不过这种实现也有明显的缺陷,在内存管理方面 容易操作上的失误而导致内存的不恰当释放。

转载于:https://www.cnblogs.com/lxzCode/archive/2011/07/09/2101495.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值