执行以下5行代码会导致内存泄漏

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

本文关键字:内存 泄漏 代码 5行 执行      更新时间:2023-10-16

这是否会导致内存泄漏,因为pWinsock没有在函数内被删除?

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

编辑:实际上,我不能删除我的指针,因为它是游戏(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时,如果没有调用删除,那么这将被视为内存泄漏,因为当Winsock不再使用时,内存将被占用。