NewL() 和NewLC()各适用于什么情况

具有二阶构造函数的类有两个创建对象的方法:NewLC()和NewL()
对于NewLC(),当指针为自动变量时,应该使用该函数,创建对象后,可以调用其成员函数,使用完毕后,需要调用CleanupStack::PopAndDestroy()释放对象资源。
对于NewL(),当指针为类成员变量时,应该使用该函数,这是因为此时没有必要将指针对象压入清理栈中,因为即使发生Leave,在类的析构函数中仍会对其进行内存释放。当然,这样保证该类是继承自CBase,只有继承自CBase的类在发生Leave时,仍会调用其析构函数。示例代码如下:

class CA : public CBase
{
public:
       CA(TInt aData = 0)
       {
              iData = aData;
              console->Printf(_L("CA::iData = %d/n"), iData);
       }

       TInt iData;
};

class CB : public CBase
{
public:
        static CB* NewL(TInt aData);
        static CB* NewLC(TInt aData);
        ~CB() { delete iCA; }

        CA* iCA;

protected:
        void ConstructL(TInt aData);
        CB() {}
};

CB* CB::NewL(TInt aData)
{
       //User::Leave(1); //在这里设置Leave来测试是否仍调用CC的析构函数
        CB* self = NewLC(aData);
        CleanupStack::Pop(self);
        return self;
}

CB* CB::NewLC(TInt aData)
{
        CB* self = new(ELeave)CB;
        CleanupStack::PushL(self);
        self->ConstructL(aData);
        return self;
}

void CB::ConstructL(TInt aData)
{
i       CA = new(ELeave)CA(aData);
}

class CC : public CBase
{
public:
        static CC* NewL(TInt aData);
        static CC* NewLC(TInt aData);
        ~CC()
        {
                console->Printf(_L("~CC()/n"));
               delete iCB;
        }

protected:
        void ConstructL(TInt aData);
        CC() { }

       CB* iCB;
};

CC* CC::NewL(TInt aData)
{
         CC* self = NewLC(aData);
         CleanupStack::Pop(self);
         return self;
}

CC* CC::NewLC(TInt aData)
{
        CC* self = new(ELeave)CC;
        CleanupStack::PushL(self);
        self->ConstructL(aData);
        return self;
}
void CC::ConstructL(TInt aData)
{
        console->Printf(_L("CC::ConstructL()/n"));
        iCB = CB::NewL(aData);
}

主函数中代码:
   CC* pCC = CC::NewLC(11);

   // call other functions

   CleanupStack::PopAndDestroy(pCC);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值