簡體   English   中英

以下5行代碼會導致內存泄漏嗎?

[英]Do the following 5 lines of code cause a memory leak?

這是否會導致內存泄漏,因為pWinsock沒有被刪除?

Winsock* CreateWinsock()
{
    Winsock* pWinsock=new Winsock;

    return pWinsock;
}

編輯:實際上,我無法刪除我的指針,因為它是Game(pWinsock)的成員,它在上面的代碼中收到了新創建的Winsock。 這有什么不對嗎?

class Game{
public:
    Game();
    ~Game();

    void CreateWindowClass(HINSTANCE);
    void CreateRessources(HINSTANCE);

    void ShowLoginScreen();

    HWND Getm_hWnd();

public:
    D2DResources* pD2DResources;
    Winsock* pWinsock;
    MessageLog* pMessageLog;

private:
    HWND m_hWnd;
};

注意,如果刪除函數中的內存,返回的指針將變為懸空指針 ,因為它的內存已被清除。 取消引用這樣的指針是未定義的行為

如果調用者不記得為自己刪除內存,程序只會導致內存泄漏。 由於您在函數中分配了內存並將其返回,因此必須在調用后以某種方式將其刪除。 要刪除內存,它看起來像這樣:

Winsock *ptr = CreateWinsock(); // memory passed to ptr
// ...

delete ptr; // delete memory

問題是,取決於調用者刪除內存是相當繁瑣和不可靠的。 通過使用諸如unique_ptrshared_ptr類的智能指針可以減輕這些潛在問題。 這些對象在調用析構函數時會刪除內存,從而具有很大的靈活性。 以下是它如何查找您的程序的示例:

std::unique_ptr<Winsock> CreateWinsock()
{
    return std::unique_ptr<Winsock>(new Winsock);
}

std::unique_ptr<Winsock> ptr = CreateWinsock();

由於封裝智能指針現在具有該責任,因此無需顯式刪除指針。

如果此函數的調用者在使用它后刪除指針,則不會發生泄漏。 因此,僅僅根據這段代碼評論內存泄漏是不合適的。

要避免調用者忘記刪除對象的情況 ,請使用共享指針或其他智能指針

不,這一切都是將指針傳遞給Winsock。 例如

Winsock* ws = CreateWinsock();
ws->doSomething();
//......
//some more stuff
//......
//Finished using Winsock
delete ws;

如果在你完成Winsock時沒有調用delete,那么這將被視為內存泄漏,因為當Winsock不再使用時,內存將被Winsock占用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM