2013-03-17 92 views
0

這是否會導致內存泄漏,因爲pWinsock未被刪除?以下5行代碼是否會導致內存泄漏?

Winsock* CreateWinsock() 
{ 
    Winsock* pWinsock=new Winsock; 

    return pWinsock; 
} 

編輯:其實,我不能刪除我的指針,因爲它是遊戲(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; 
}; 
+1

只要你在其他地方刪除它。真的,智能指針有幫助。 – chris 2013-03-17 18:38:00

+1

你**不能**刪除這個函數,因爲那樣你會返回一個懸掛指針。 – us2012 2013-03-17 18:38:43

+0

你的意思是智能指針有幫助嗎? – 2013-03-17 18:38:57

回答

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(); 

沒有必要明確地刪除指針作爲封裝智能指針現在有責任。

0

如果此函數的調用者在使用它之後刪除指針,則不會泄漏。因此,只給這段代碼評論內存泄漏是不合適的。

要從其中呼叫者忘記刪除對象,使用shared pointer,或另一smart pointer這樣的情況下避免。

0

不,所做的只是傳回指向Winsock的指針。例如

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

如果當你的Winsock完成刪除不叫有那麼這將被視爲一個內存泄漏,因爲當其不再使用的內存將採取由Winsock的。

+0

我無法刪除ws,因爲它是Game的私人成員。這有什麼不對嗎? – 2013-03-17 18:55:21

+0

不是它的私人成員,它是一個指向堆初始化內存的指針,所有你正在做的就是傳回內存的地址。你不能通過'delete game.pWinsock'來做到這一點,因爲它是類Game的私人成員。因此,你所做的只是創建一個Winsock並通過該方法傳回地址,並將其分配給類之外的新指針或方法被調用的地方,這是否合理? 編輯:其實'刪除game.pWinsock;'工作,因爲它在這個例子中公開,但假設它的私人它不起作用。 – 2013-03-17 19:04:14

+0

那麼將Game中的指針分配給新創建的對象的正確方法是什麼? – 2013-03-17 19:06:10

相關問題