싱글 톤 디자인 패턴을 구현하는 클래스가 있습니다. 나는 어떤 사람들은 그에게 좋은 아이디어를 생각하지 않는다 알고 있지만, 어쨌든 많은,싱글 톤을 사용할 때 메모리 누수가 발생했습니다.
을하는 데 도움이 - 나는 메모리 누수가 및 vlagrind이 라인에 나 포인트 :
_singleton = new Manager(); //Manager::instance() (Manager.cpp:18)
그리고
을Manager::Manager() : _file(new ofstream), _tasks(new map<int, Task *>()),
_idState(new map<int, int>()), _closing(false), _pending(false),
_lock(new pthread_mutex_t), _endLock(new pthread_mutex_t), _cond(new pthread_cond_t),
_flushCond(new map<int, pthread_cond_t *>()), _attr(new pthread_attr_t) {
//The last line is line 25 in Manager::Manager
관리자의 소멸자에서 바보 루프를 생성하기 때문에 (소멸자가 _singleton을 삭제할 때 무한 루프가 발생 함) 호출되므로 명시 적으로 삭제할 수 없습니다. 이 누출을 어떻게 제거합니까? 감사!
p.s.
==17823== 512 bytes in 1 blocks are definitely lost in loss record 2 of 2
==17823== at 0x4C27297: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17823== by 0x40151E: Manager::Manager() (Manager.cpp:25)
==17823== by 0x4014DB: Manager::instance() (Manager.cpp:18)
==17823== by 0x406475: initdevice(char*) (outputdevice.cpp:66)
==17823== by 0x4061D5: main (driver.cpp:21)
==17823==
==17823== LEAK SUMMARY:
==17823== definitely lost: 512 bytes in 1 blocks
= =17823== indirectly lost: 0 bytes in 0 blocks
==17823== possibly lost: 288 bytes in 1 blocks
==17823== still reachable: 0 bytes in 0 blocks
==17823== suppressed: 0 bytes in 0 blocks
추가 :
Manager.h:
class Manager {
public:
~Manager();
static Manager * instance();
private:
Manager();
static Manager * _singleton;
};
및 구현 : 여기에 내가 관리자 생성 코드의 여기 Valgrind의의 출력
Manager.cpp:
Manager * Manager::_singleton = 0;
Manager * Manager::instance() {
if (!_singleton)
_singleton = new Manager();
return _singleton;
}
"이제 Manager의 소멸자에서 바보 루프를 만들기 때문에 명시 적으로 삭제할 수 없습니다." 그게 무슨 뜻이야? –
은 Manager의 인스턴스를 만들고 파괴하는 방법을 보여줍니다. – Zuljin
포인터로 처리하지 마십시오. 훨씬 잘 작동합니다. http://stackoverflow.com/a/1008289/14065 gcc에서 쓰레드에 안전합니다 (링크 된 질문에있는 주석을보십시오). 포인터를 사용한다고해도 결코 포인터를 반환해서는 안되며, 그렇지 않으면 호출자는 객체를 삭제해야하는지 모릅니다. –