繁体   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