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