2009-11-13 45 views
1

我有一个方法指针象下面这样:内存已满通过它的方法指针调用一个方法

typedef void (MMsnInternalCallBacks::* FuncPtr)(); 
FuncPtr iSoapActionComplete;   

我打电话通过指针iSoapActionComplete像下面下面的方法:

(iCallbacks.*iSoapActionComplete)(); 

虽然功能被称为“Memory Full。尝试关闭某些应用程序”的消息在我的Symbian S60 3rd Ed模拟器上闪烁。

任何想法为什么会发生这种情况。

回答

2

如果函数不是通过方法指针调用,而是直接调用,函数是否工作?

该消息的可能的原因是该函数与KErrNoMemory-4离开和Leave由应用程序框架陷阱捕获的线束,从而在适当的对话框。

例如当operator new(TLeave)未能分配内存或将零参数传递给User::LeaveIfNull()时,会发生此类假期。有时甚至可以看到明确的User::Leave(KErrNoMemory)调用。

你可以TRAP()回调函数调用来抓你自己。更好的是,你应该修复这个功能本身,以避免在正常的晴天情况下离开。

(另外,按照惯例,在离开函数具有L后缀由于您使用的实例数据的i前缀,你可能知道的Symbian C++的命名约定。)

+0

laalto:虽然很难找到假期是由内存分配失败引起的。我学到的教训是对可以离开的每一个电话进行TRAP。谢谢。 – ardsrk 2009-11-18 13:28:41

+1

不要扣留每一个可以离开的电话。让叶子传播到足够高的级别,以便您可以决定适当的恢复策略。应用程序框架的显示对话框和终止(如果在应用程序构建期间离开)或继续处理下一个事件(如果在事件处理期间离开,即最终在活动调度程序循环中)的策略实际上是相当好的通用策略。 – laalto 2009-11-20 10:00:46