c++ - 下面5行代码会导致内存泄漏吗?

标签 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;
};

最佳答案

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

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

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

delete ptr; // delete memory

问题是依赖于调用者来删除内存是相当麻烦和不可靠的。通过使用 smart pointers 可以缓解这些潜在问题。例如unique_ptrshared_ptr .这些对象在调用其析构函数时删除内存,从而提供了极大的灵 active 。以下是它如何查找您的程序的示例:

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

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

不需要显式删除指针,因为封装智能指针现在有这个责任。

关于c++ - 下面5行代码会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15464621/

相关文章:

c++ - WCHAR* 结尾包含垃圾

c++ - OpenCV 相机标定

c++ - 面向对象的 C++ win32?

c++ - 如何实现pop()函数

objective-c - 为什么 NSNumber 在值相等时指向同一个地址?

c++ - 从 C++ std::vector 中删除第 i 个项目

architecture - 在哪里验证程序中的用户输入?

java - 如何告知比较使用的方法

java - 为什么在 java 中键入带参数的构造函数时不提供默认构造函数?

c++ - 在 opencv 中使用 imshow 显示字节数组的最快方法是什么?