执行以下5行代码会导致内存泄漏
Do the following 5 lines of code cause a memory leak?
这是否会导致内存泄漏,因为pWinsock没有在函数内被删除?
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;
};
注意,如果删除函数中的内存,返回的指针将成为悬垂指针,因为它的内存已经被清除。对这样的指针解引用是未定义的行为。
程序只有在调用者不记得为自己删除内存时才会导致内存泄漏。由于您在函数中分配了内存并返回了它,因此在调用之后必须以某种方式删除它。要删除内存,它看起来像这样:
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时,如果没有调用删除,那么这将被视为内存泄漏,因为当Winsock不再使用时,内存将被占用。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏