NewL() 和 NewLC()各適用於什麼情況

來源:互聯網
上載者:User

具有二階建構函式的類有兩個建立對象的方法: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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.