关于new和delete的小疑问

C++语言 码拜 4年前 (2016-09-26) 564次浏览
某种数据存放在链表中,数量会动态变化,现在要返回全部的这种数据。
每次调用时临时分配一段内存来保存这种数据,需要频繁地new和delete.
问一下这样使用会不会造成内存碎片呢?
假如会的话有什么方法来避免?(不想使用固定大小的空间来存储)

int CStation::getYKAllowPoints(TYKAllowOrNotPoint **outPoints, int *nOutNum)
{
	int nNum=0;
	m_pYKAllowForbid->getCountFromAllowTable(&nNum);	//获取记录个数
	if (nNum>0)
	{
		if (m_pYKAllowData==NULL)
		{
			delete m_pYKAllowData;
		}
		m_pYKAllowData = new TYKAllow[nNum];//分配的空间存在类的成员变量中,TYKAllow自定义结构体
		m_pYKAllowForbid->getDataFromAllowTable(m_pYKAllowData);//获取数据
		*outPoints	= m_pYKAllowData;//返回数据指针,函数调用方可以用"m_pYKAllowData[0]->XXX"使用数据
		*nOutNum	= nNum;
	}
	else
	{
		*outPoints  = NULL;
		*nOutNum	= nNum;
	}
	return nNum;
}
解决方案

10

内存池………………………………

10


使用malloc、realloc、free

25

这里有说明:
http://bbs.csdn.net/topics/50191898
http://bbs.csdn.net/topics/300260894

30

碎片有,但是碎片的大小不会计算在你程序使用的内存中的。
对于长期运行的程序来说, 尽量会内存池吧, 动态申请内存肯定会存在内存碎片的, 最终导致系统有内存却分配不到的情况.

20

现在内存碎片问题并不像过去(其实是很久以前,以及某些特殊环境下)那么严重,普通的程序完全没必要担心内存碎片的问题。

30

会!
可以使用内存池(如STL中就如此解决)
可以本人参照写一个,boost中也有一些分配器,可直接拿来用

5

STL、Boost、loki里面都有内存池

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于new和delete的小疑问
喜欢 (0)
[1034331897@qq.com]
分享 (0)