删除单一实例对象 cpp 时出现内存泄漏
Memory leak when deleting a singleton object, cpp
我不知道为什么我在这里有内存泄漏,非常感谢任何建议。请注意,在进程终止之前,我调用 destroy((,这是一个静态成员函数,应该删除单例对象。
以下是相关的代码和valgrind的消息:
Manager.h:
class Manager {
public:
// Constructor/destructor
static Manager * instance();
static void destroy();
~Manager();
// Bunch of functions that I didn't write here
private:
Manager();
static Manager * _singleton;
// Bunch of fields that I didn't write here
};
Manager.cpp:
#include "Manager.h"
Manager * Manager::_singleton = NULL;
Manager * Manager::instance() {
if (_singleton == NULL) {
_singleton = new Manager();
}
return _singleton;
}
void Manager::destroy()
{
delete _singleton;
_singleton = NULL;
}
/*
* Destructor
*/
Manager::~Manager() {
// Deleting all fields here, memory leak is not from a field anyway
}
这是瓦尔格林德的报告:
==28688== HEAP SUMMARY:
==28688== in use at exit: 512 bytes in 1 blocks
==28688== total heap usage: 12 allocs, 11 frees, 10,376 bytes allocated
==28688==
==28688== 512 bytes in 1 blocks are definitely lost in loss record 1 of 1
==28688== at 0x4C27297: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==28688== by 0x4014CE: Manager::Manager() (Manager.cpp:33)
==28688== by 0x401437: Manager::instance() (Manager.cpp:15)
==28688== by 0x4064E4: initdevice(char*) (outputdevice.cpp:69)
==28688== by 0x406141: main (driver.cpp:21)
==28688==
==28688== LEAK SUMMARY:
==28688== definitely lost: 512 bytes in 1 blocks
==28688== indirectly lost: 0 bytes in 0 blocks
==28688== possibly lost: 0 bytes in 0 blocks
==28688== still reachable: 0 bytes in 0 blocks
==28688== suppressed: 0 bytes in 0 blocks
为什么会有这种泄漏?我确实删除了destroy()
中的_singleton
正如我所说,我将不胜感激任何帮助,谢谢!
这里有几点需要注意。 最明显的是:你什么时候呼叫Manager::destroy
。 第二件事是内存valgrind
似乎在抱怨在构造函数中分配 Manager
,你不给我们看。 如果我们可以相信错误消息(我通常发现valgrind
在这方面是可靠的,虽然可以愚弄(,但没有剩余的指向内存的指针;要么您没有删除对象中的一个字段,要么对象在其构造函数中分配内存,它不会保存在田。
最后,通常更好的做法是不破坏单例。单例成语的全部目的是避免顺序初始化问题(至少在C++中 - 否则,只是声明对象的静态实例就足够了(。 析构对象引入了可能的销毁顺序问题。 如果你不破坏它,valgrind
会警告可能的内存泄漏(不是"绝对丢失"(;您可以忽略警告,也可以将其过滤掉。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏