我不知道为什么我这里有内存泄漏,非常感谢任何建议。 请注意,在进程终止之前,我调用destroy(),这是一个应该删除单例对象的静态成员函数。
这是相关的代码和valgrind的messaeg:
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
}
这是valgrind的报告:
==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
为什么我有此漏洞?我删除了_singleton
destroy()
正如我所说,我将不胜感激,谢谢!
答案 0 :(得分:6)
这里有几点需要注意。最明显的是:你什么时候
致电Manager::destroy
。第二件事是内存valgrind
好像在抱怨是在构造函数中分配的
Manager
,您没有告诉我们。如果我们能相信错误信息
(我一般认为valgrind
在这方面是可靠的,
虽然它可以被愚弄),但没有剩余的指向内存的指针;
要么你没有删除对象中的一个字段,要么删除
object在其构造函数中分配内存,它不会保存在
领域。
最后,通常更好的做法是而不是来破坏单身人士。
单身成语的整个目的是避免秩序
初始化问题(在C ++中,至少 - 否则,只是声明
一个静态的对象实例就足够了)。破坏对象
介绍了破坏问题的可能顺序。如果你不破坏
它,valgrind
将警告可能的内存泄漏(不是“确切地说
丢失“);您可以忽略警告,也可以将其过滤掉。