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

时间:2013-03-17 18:37:27

标签: c++ oop pointers memory memory-leaks

这是否会导致内存泄漏,因为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;
};

3 个答案:

答案 0 :(得分:2)

注意,如果删除函数中的内存,则返回的指针将变为dangling pointer,因为它的内存已被清除。取消引用这样的指针是undefined behavior

如果调用者不记得为自己删除内存,程序只会导致内存泄漏。由于您在函数中分配了内存并将其返回,因此必须在调用后以某种方式将其删除。要删除内存,它看起来像这样:

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

delete ptr; // delete memory
问题是,取决于调用者删除内存是相当繁琐和不可靠的。通过使用smart pointersunique_ptrshared_ptr可以缓解这些潜在问题。这些对象在调用析构函数时会删除内存,从而具有很大的灵活性。以下是它如何查找您的程序的示例:

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

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

没有必要显式删除指针,因为封装智能指针现在有责任。

答案 1 :(得分:0)

如果此函数的调用者在使用它后删除指针,则没有泄漏。因此,仅仅根据这段代码评论内存泄漏是不合适的。

要避免出现来电者忘记删除对象的情况,请使用shared pointer或其他smart pointer

答案 2 :(得分:0)

不,这一切都是将指针传回Winsock。例如

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

如果在你完成Winsock时没有调用删除,那么这将被视为内存泄漏,因为当Winsock不再使用时,内存将被Winsock占用。