作者:hoolee
在一台手机(或SDK的模拟器)上会有一定的物理内存大小,而你的应用程序将获取一部分做为堆内存使用。
当你程序启动后产生进程,会有一个预先分配的堆给其使用。S60第三版设备上缺省大小是4KB,早期的S60平台上是1KB。
根据需要,应用程序可以自由分配更多的堆内存,程序能使用的堆大小可在1M范围内动态增加,这是操作系统所规定最高极限了,呵呵。
如果试图分配的内存超过所能最大限制,将引发KErrNoMemory异常。
大部分Symbian C++程序在这样的堆内存安排下可以正常工作,但有时间我们需要更大的堆内存来工作。我们可以通过MMP文件中使用EPOCHEAPSIZE命令来指定最大和最小堆内存。
例如
<code>
TARGET MemoryTest.exe
TARGETTYPE exe
UID 0x00000000 KMemoryTestUID3
SECUREID KMemoryTestUID3
VENDORID 0x00000000
CAPABILITY NONE
EPOCHEAPSIZE 0x5000 0x400000
EPOCSTACKSIZE 0x5000
在S60 3rd中,增大默认堆栈的大小
在S60第三版中,默认的堆栈大小为8k,它不能满足一些复杂的应用程序。
详细描叙
随着Symbian 9的到来,由于平台安全,导致系统在允许程序时需要更多的内存,所以默认堆栈由原来的8K增加到了20K。
实际上,8K已经被证实在大一点的S60应用程序中是远远不够的。堆栈大小足够,程序可以正常运行,内存溢出将带来很大的风险,在S60 3rd的平台库中,有一个新的特点,它可以稍微的增加一点堆栈,因此,使用小的堆栈也将危害到二进制的兼容性。
在S60 3rd的SDK中,推荐为所有应用程序增加堆栈大小为20K。应用程序需要重新编译来改变堆栈大小。
最大的用户线程堆栈大小为:0x14000 ~80K
每个程序最大的堆栈大小为:0x200000 ~2MB.
解决办法
改变堆栈大小不同于默认的8K,可以配置MMP文件中的epocstacksize申明:
堆栈的大小字节数,可以指定为十进制,或者十六进制格式。使用这个申明,在WINSCW/WINS平台下是看不出效果的。
例如:添加下面的一行到MMP文件中,将增加堆栈大小到20K:
注:你也可以选择,在新线程创建时定义堆栈的大小。
适用平台:
S60 3rd Edition
....
</code>
在上述代码中,应用程序描述了它所需要的最大和最小堆内存,分别是0x5000字节(20KB)和0x400000字节(4MB),现在该程序可以安全来分配一块3MB的堆空间。
Note: As documented, prior to S60 3rd Edition the EPOCHEAPSIZE statement has no effect on WINS32 platforms.