return new 內存泄漏

樣例如下:

#include <iostream>

class B
{
public:
    int Fun()
    {
        return 100;
    }
}

class A
{
public:
    B* CreateB()                    //new了個B對象
    {
        return new B();
    }
}

int main()
{
    A *aa=new A();
    std::cout<<A->CreateB()->Fun(); //new的B對象沒有被delete掉,內存泄漏

    delete aa;
    aa=nullptr;

    return 0;
}

解決方式:

1、方式一

智能指針【推薦此方式】

#include <memory>               //for unique_ptr

class A
{
public:
    std::unique_ptr<B> CreateB()                    //new了個B對象
    {
        std::unique_ptr<B> up_b(new B());           //使用智能指針,會自動釋放資源
        return up_b;
    }
}

2、方式二

再寫個刪除函數

class A
{
public:
    B* CreateB()                    //new了個B對象
    {
        return new B();
    }
    void DeleteB(B** pObj)          //釋放B對象
    {
        if(pObj!=nullptr && *pObj!=nullptr)
        {
            delete *pObj;
            *pObj=nullptr;
        }
    }
}

int main()
{
    A *aa=new A();
    B *bb=aa->CreateB();    //其中new了個B對象
    std::cout<<bb->Fun(); 

    aa->DeleteB(&bb);       //釋放B對象

    delete aa;
    aa=nullptr;

    return 0;
}

3、方式三

int main()
{
    A *aa=new A();
    B *bb=aa->CreateB();    //其中new了個B對象
    std::cout<<bb->Fun(); 

    delete bb;              //釋放B對象
    bb=nullptr;
    delete aa;
    aa=nullptr;

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章