2013-03-17 66 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

相关问题