[英]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_ptr
或shared_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.