向别人请教问题怎么说关于内存释放的问题

共有1879位成员   人气指数 -   最新排名 -
【话题】请教一个内存释放的问题,关于release和debug不同
08:26:42 来自:tangziping 浏览数:206次
& & 我需要载入一个文件的数据,并且将数据读到内存中,在这个读取的过程中,我不断的new空间(类型是自定义的一个类),并且把首地址赋值到一个CTypedPtrArray类型的数组。这个数组比较大,动辄上万个元素。
& & 关闭文件时,我希望释放内存,就是在另外一个函数中,把元素一个个取出来delete。
& & 现在的情况是,debug版,能够正常的释放空间,比如在任务管理器查看程序占用的内存,打开文件前占用100M,打开后是150M,关闭文件时这个占用的内存可以降到100M左右,但是release版本却不行,可能只降到120M。但是release也不会报错,关闭时正常运行。
& & 我检查过,delete的次数是一样的,并且检查了部分delete的空间大小(用sizeof(*p)查看)也是一样的。
& & 我查过两个编译的版本的区别,但是找到的说的都是两者编译的时候一些参数的设置的区别,还有就是类似变量初始化的问题,也有自定义消息响应函数的问题。我试过编译的一些参数的设置没办法解决,还有变量初始化这些都没问题。
& & 请各位支支招!!!!分数可以继续加。。。。谢谢各位高手了。。。。
快乐鼠妈回复于06日08点41分 
当然release打开时占用的内存跟debug不相同,我前面给的release的数据只是大概的比较一下。
比如打开文件前,release占用100M,打开后150M,关闭文件后就是120M左右。
现在关键不是这里占用多少,而是这个数据差跟我打开的文件大小有关(其实就是跟new的次数有关),如果我打开的是几百兆的文件的话,这个相差就有几百兆甚至1g了。
至于指针,我是这样用的。假设存储数据的类是CData.它有自己的构造函数,分别对各个数据成员赋值。
CData* p=new CData();
p-&member1=*******;//多条类似的语句赋值给部分成员,一部分成员没有赋值,赋值验证正确。
m_Array.Add(p);//然后把这个p存到CTypedPtrArray类型的数组m_Array.
释放的时候:
for(int i=0;i &m_Array.GetSize();i++)
CData *p=m_Array.GetAt(i);
m_Array.RemoveAll();
这样的操作有什么问题么?
changlan2005回复于06日08点54分 
m_Array.FreeExtra();
试过啦??
sylivea回复于06日09点10分 
以前遇到过这样的情况,但是很神奇的是换成了HeapAlloc之后,就不会出现如此大的内存消耗差异了
jhmei123回复于06日09点26分 
删除代码没什么问题,可以尝试一下只增加一个元素,然后删除一个元素试试。
chouchouruyi回复于06日09点40分 
因为查了一些release和debug的资料,很多说的是debug自己定义了new用来检测内存泄露。所以我想像前面biweilun所说的,使用其他函数来分配内存,但是现在的问题是,我的Cdata里面有很多的CString,如果用其他函数,比如malloc来分配的话,需要知道大小,比如malloc(sizeof(CData)),但是这样的话,一旦给CString对象赋值的时候,就会出错。其他分配内存的函数也都是这样的情况。
& & 但是因为成员变量很多,使用的地方更多,所以我也不方便把这个CString 改成其他的类型,大家有什么办法可以给CString分配内存么?
关心孩子的教育回复于06日09点55分 
各位大哥支支招呀
ht0924回复于06日10点09分 
需要头文件new 或new.h
Baoyuxuan回复于06日10点27分 
按我说的方法试试。逐步定位问题所在。
CData的成员变量不方便给出么?
byz25ms回复于06日10点40分 
还是代码的问题,debug版和release的主要区别就在于对指针的初始化等方面,在这些方面检查一下。
huanghaihua回复于06日10点56分 
这个没办法,内存是这样子的,比方你先new一片内存,、系统就会在原来内存最末页尾上加上24字节+你分配的字节,再分再在后面加,当你删除了前面一个内存里候,系统把那小部分还原成0xfe,如果该页面上还有一个零散的内存,那么就不会删除该页面,就是说内存大小不变,只有当一个页面里所有字节都末使用,系统才会把该页面删除,效果就是看到内存变小了,从这里可以看出,分配次数越少越好,还有就是后分配的如果先删除,就会符合系统分配的方法,就会很容易看到内存按你想法在变化,如果没按顺序,就会有一些页面因为仅有小部分数据而被系统保留着空间
可以试试分配的链表头设为最末分配的内存,这样从头删除就符合系统顺序了,
也可以一次性分配CData *p[N]数组,删除的时候直接用delete[]p;
还有可以用C结构,如果有字串,使用类似
C/C++ code
typedef struct {
char str[1];
分配时候EXP * p = (EXP*)new char[sizeof(otherdata) + sizeof(int) + len]//len为你要分配的字串长度,这样把内存分配在一个紧凑的位置,删除时候只需直接删除delete []就把所有数据和字串一次删除了,性能要好些
jinbinquan回复于06日11点11分 
从CData,m_Array的释放来看,没什么问题,你要看CData中是否还有别的数据等没有释放...
能者一号回复于06日11点24分 
这个问题很可能跟mfc的数组类的实现有关,如果楼主说的这个差值不随文件操作次数的增加而增大,那就不用
fxk520wm1414回复于06日11点37分 
怎么支招啊,问题不在你给出的这些内容中,怎么给你支招呢,也不知道你是怎么写的啊
liuguanghong123回复于06日11点51分 
你如果能确定没有内存泄露,用任务管理器查看程序占用的内存的可信程度应该低一些。
是仅仅刚结束的时候多占20M 内存还是以后一直这样?
频繁启动这个release的exe就能看出是不是吃内存,如果就保持这个水平我觉得你完全可以忽略不管它。
恬恬想要飞回复于06日12点08分 
用 boundschecker 查下内存是否有泄漏
金宇辉回复于06日12点22分 
毛毛糙糙回复于06日12点39分 
for(int i=0;i
&m_Array.GetSize();i++)
& CData *p=m_Array.GetAt(i);
没有问题。
这个东西我一般都倒删,你这里用GetAt是没事,要是删除就出事儿了。
jackyin回复于06日12点54分 
呃,我真想不出问题还能在这之外啊。想用malloc来分配内存试试,但是类里面有Cstring,分配的大小不知道怎么搞。直接用Sizeof到给Cstring赋值时会报错
AAA_0318回复于06日13点07分 
试过了,freeextra不行
另外,我自己用了一个指针数组来保存指针,还是一样的效果。
柳林风声回复于06日13点22分 
是啊,所以问题不在你怀疑的这个CData上,还是和你系统其它地方有关系。
MFC开发的其他话题...
热门脚本语言:关于内存释放的一些问题(困惑请教 )!
24vcPointer]
关于内存释放的一些问题(困惑请教 )!
24vcPointer]
发布时间: 12:36:41
编辑:www.fx114.net
本篇文章主要介绍了"关于内存释放的一些问题(困惑请教 )!
24vcPointer]",主要涉及到关于内存释放的一些问题(困惑请教 )!
24vcPointer]方面的内容,对于关于内存释放的一些问题(困惑请教 )!
24vcPointer]感兴趣的同学可以参考一下。
&&&C1&*pC1=new&C1();
&&&.........
&&&funct2(pC1);
&&&.........
&&&if(...)
&&&&&delete&pC1;
funct2(C1&*pC)
&&C1&*pC2=pC;
&&........
该流程只是说明funct2与funct1有指向同一地址的指针。
如何在funct2中获知pC2所指的内存地址已被释放?不知是否有函数?
注:C1不是从CObject派生,不能使用IsKindof(RUNTIM_CLASS(C1))!gz在删除指针的同时,把指针赋空(NULL),再在funct2中判断是否为空就行了最简单的办法是在delete&pC1之后将pC1&=&NULL;
在funct2中判断pC是否为NULL!哎呀,楼上的说了先
:)直接在funct2中判断是否为空就行。对不起,可能我没表达好让大家误会了!
我的意思是pC作为参数传入funct2后,funct2在另一个线程中与funct1同时执行,当funct2执行时可能funct1已将pC&delete了。所以即使在funct1中将pC1=NULL,而funct2中的pC2还是等于某个内存地址,造成出错。我觉得需要直接对内存进行判断,我现在是通过长度来判断,觉得不妥当,但不知有没有这类更好的函数?谢谢大家!^_^你可以查看一下MSDN中的AfxIsValidAddress,但我觉得最好是从程序结构上去避免这种做法。如果确实需要这样就要考虑线程间的同步了。to&lindongy(东东):
&&谢谢!我会试的,不管灵不灵我给你加分先。^_^
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:

我要回帖

更多关于 echarts 内存释放问题 的文章

 

随机推荐