这是否会导致内存泄漏,因为 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_ptr
或 shared_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/