这是否会导致内存泄漏,因为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;
};
答案 0 :(得分:2)
注意,如果删除函数中的内存,则返回的指针将变为dangling pointer,因为它的内存已被清除。取消引用这样的指针是undefined behavior。
如果调用者不记得为自己删除内存,程序只会导致内存泄漏。由于您在函数中分配了内存并将其返回,因此必须在调用后以某种方式将其删除。要删除内存,它看起来像这样:
Winsock *ptr = CreateWinsock(); // memory passed to ptr
// ...
delete ptr; // delete memory
问题是,取决于调用者删除内存是相当繁琐和不可靠的。通过使用smart pointers或unique_ptr
等shared_ptr
可以缓解这些潜在问题。这些对象在调用析构函数时会删除内存,从而具有很大的灵活性。以下是它如何查找您的程序的示例:
std::unique_ptr<Winsock> CreateWinsock()
{
return std::unique_ptr<Winsock>(new Winsock);
}
std::unique_ptr<Winsock> ptr = CreateWinsock();
没有必要显式删除指针,因为封装智能指针现在有责任。
答案 1 :(得分:0)
如果此函数的调用者在使用它后删除指针,则没有泄漏。因此,仅仅根据这段代码评论内存泄漏是不合适的。
要避免出现来电者忘记删除对象的情况,请使用shared pointer或其他smart pointer。
答案 2 :(得分:0)
不,这一切都是将指针传回Winsock。例如
Winsock* ws = CreateWinsock();
ws->doSomething();
//......
//some more stuff
//......
//Finished using Winsock
delete ws;
如果在你完成Winsock时没有调用删除,那么这将被视为内存泄漏,因为当Winsock不再使用时,内存将被Winsock占用。