引起内存泄漏?

yanxunet 2008-12-05 05:01:13
Symbian操作系统的另一个重要概念就是二阶构造,它被广泛地使用在工程中。二阶构造提出的目的

是为了解决构造函数的资源分配问题,下面选举一个简单。例子:

CMyAppUi::CMyAppUi()
{
...
iAppContainer = new(ELeave)CMyAppContainer;
...
}

其中,CMyAppUi对象是在CMyAppDocument::CreateAppUiL()方法中创建的,如果CMyAppUi的内存空间

在CMyDocument::CreateAppUiL()方法中分配成功,但是在创建iAppContainer对象时发生Leave,那么指向

CMyAppUi对象的内存空间的指针将丢失,引起内存泄漏。


这个有点难以明白:
class A
{
....

public:
A()
{ B b = new(ELeave)B; }

.....

};

class B
{
....
};

A a = new(Eleave)A;
CleanupStack::PushL(a);
......
CleanupStack::
这段代码会引起一个问题:如果a对象创建成功(内存分配成功),但在构造函数中发生Leave,那么指向a对

象的指针将丢失,引起内存泄漏?

对象不是在创自的时候分动调用构造函数吗?应该是调用成功了才算对象创建成功吧?那在创造过程中的构

造函数过程中发生Leave就会引起调用它的上一层A a = new(Eleave)A;这一句发生Leave?
如果是这样,那上面的就说不通了?
...全文
63 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jlxtlinbercsu 2008-12-06
  • 打赏
  • 举报
回复
楼上说得对。
alex_hua 2008-12-06
  • 打赏
  • 举报
回复
创建对象的时候,是先申请内存分配,分配成功后再调用类构造方法初始化,所以在构造函数
中若发生Leave,那之前分配的内存就泄露了。

要避免这样的设计~
yanxunet 2008-12-06
  • 打赏
  • 举报
回复
我的意思是说如果在构造函数中发生Leave那么A对象也就没有创建成功,也就没有分配到内存?何来泄漏?我不是问二阶构造!
alex_hua 2008-12-05
  • 打赏
  • 举报
回复
二阶段构造的核心是,在构造函数里面保证是不会发生Leave的(从函数名也可以判断,不带L),所有可能发生Leave的代码放入ConstructL()中,这样就不会存在你说的那种情况~

假如有这样的调用:A a = new(Eleave) A,这也应该表示只有当分配A对象时内存不够才会发生Leave,内存分配没问题的情况下,后续的构造初始化不应该包含任何可能Leave的方法~

3,120

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧