winCE对内存的管理是不是有问题啊?请高手指点内存回收问题
为什么用new分配了内存,使用完毕以后delete掉了,可是只要进程不退出,那么该内存就好像没有被释放,内存越用越少,必须退出进程,所有的内存才算真正的释放掉了,这不是见鬼吗?那位高手能给些指点?是不是wince对内存的管理太差了? 问题点数:100、回复次数:15Top
1 楼91program(当时明月在,曾照彩云归)回复于 2005-04-01 22:26:54 得分 5
这怎么可能?楼主如何得出上述结论的?Top
2 楼jiess(刘伟庭)回复于 2005-04-01 22:44:21 得分 5
是啊,我想应当是有些内存没用delete,或是有些系统资忘了释放或是释放时,资源正在使用,所以释放失败了吧.
如果程序是用.net写的话可能不会马上给释放,因为它是属于一种内存回收机制.Top
3 楼nbcool(载舟之水)回复于 2005-04-01 23:01:38 得分 5
不知道你是如何统计的,应该是你用法的问题。Top
4 楼wangshiqi(钾肥)回复于 2005-04-02 11:17:10 得分 5
jiess说得不错,在delete一个对象时,看看有没有需要release的.
另外,看看是不是有些地方该用 delete [],而你用了deleteTop
5 楼slyzhang(http://blog.csdn.net/group/slyzhang/)回复于 2005-04-03 13:54:50 得分 5
wince 下的内存管理应该是比较严密的。。不应该出现什么问题的。仔细检查了。。。。Top
6 楼MrFool(笨笨先生)回复于 2005-04-03 15:07:30 得分 5
楼主还是先用codesnitch这种软件检查一下自己的程序有没有内存泄漏吧Top
7 楼questionboy(我行我素)回复于 2005-04-04 09:28:52 得分 0
非常感謝各位的指點,我知道一定會得到類似的批評,所以其實我也很懷疑自己的程序有問題,我這個結論的得出也是基於工具codesnitch::procman的,而且內存絕對沒有洩漏,因為整個應用程序退出則所有的內存恢復到初始值,但是只要在進程中,就會出現我說的怪問題,new something, do something, delete,內存大小并沒有恢復到new之前的大小,由於工程比較龐大,查起來還真的是有點難度,謝謝各位了,我再看看Top
8 楼questionboy(我行我素)回复于 2005-04-04 09:32:56 得分 0
忘了說自己的工作環境,EVC 4.0 + SP4, PocketPC 2003, GAPI, WinCE5.0下面的一個庫IImagingTop
9 楼91program(当时明月在,曾照彩云归)回复于 2005-04-04 12:50:30 得分 40
做个实验:
将内存申请的大小加大,重复执行
看看是否出现死机现象?Top
10 楼questionboy(我行我素)回复于 2005-04-04 14:34:03 得分 0
#include <vector>
using namespace std;
vector<int*> g_vec;
void ClearVec()
{
for( unsigned long l=0; l<g_vec.size(); ++l )
delete g_vec[l];
g_vec.clear();
}
void FillVec()
{
int n = Random()%100;
for( int i=0; i<n; ++i )
g_vec.push_back( new int(0) );
TCHAR ch[32];
_stprintf( ch, TEXT("vec's length=%ld\n"), g_vec.size() );
OutputDebugString( ch );
}
以上是一个很简单的测试,WCE Pocket 2003 Application, 鼠标左键点击则随机创建一些指针添加到数组中,右键点击则清空数组,最后退出程序的时候也会做清空的动作,数组为全局变量,使用Entrek::ProcMan检测内存的状态,发现剩余内存(Available pragram memory)永远都在减少,清空数组的动作根本不能使其恢复原始的状态,但是在下次分配内存的时候,如果分配的数量没有达到上次清空前的最大值,则数字无变化,也就是说,内存永远保持被使用的最大状态,为什么?我相信自己的程序没有错,因为这实在是太简单了,如果错了我就去自杀算了。我使用的是Entrek--ToolBox的试用版本,难道是这个工具搞错了?整个进程退出后,所有内存恢复正常,真是见鬼啊!Top
11 楼yzx0023(无聊客)回复于 2005-04-04 15:25:20 得分 0
void ClearVec()
{
for( unsigned long l=0; l<g_vec.size(); ++l )
delete g_vec[l];
g_vec.clear();
}
void FillVec()
{
int n = 100;
int iSize = Random()%1000000;
for( int i=0; i<n; ++i )
g_vec.push_back( new int[iSize] );
TCHAR ch[32];
_stprintf( ch, TEXT("vec's length=%ld\n"), g_vec.size() );
OutputDebugString( ch );
}
你再看看结果Top
12 楼yzx0023(无聊客)回复于 2005-04-04 15:26:43 得分 0
int iSize = Random()%100000;
你把iSize调小点,memory小的机器还抗不住
Top
13 楼questionboy(我行我素)回复于 2005-04-04 16:45:37 得分 0
這種類似的測試已經做過了,沒用,算了,不煩了,由他去吧,反正我可以肯定自己的程序沒有內存洩漏Top
14 楼91program(当时明月在,曾照彩云归)回复于 2005-04-04 21:19:57 得分 30
楼主说测试没有用,最证明内存管理没有问题。
至于问题出在哪,不好说:
(1)程序有问题
(2)得出内存不能被回收的方法不正确。
一般的程序员总是说自己的程序没有问题,直到问题被发现,哈哈......Top
15 楼questionboy(我行我素)回复于 2005-04-06 16:56:49 得分 0
其實這個道理我懂,可是是在找不出原因,使用工具也沒效果,只好如此了.我相信絕大多數情況下,系統遠比我們強大和聰明的多,有可能是方法不得檔Top




