2012-05-15 71 views
0

我不知道爲什麼我在這裏有內存泄漏,真的很感謝任何建議。 注意,在進程終止之前,我調用了destroy(),這是一個應該刪除單例對象的靜態成員函數。刪除一個單例對象時發生內存泄漏,cpp

下面是相關的代碼和的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 

爲什麼我有這樣的泄漏?我刪除_singletondestroy()

正如我所說,我將不勝感激任何幫助,謝謝!

+3

難道你調用'destroy()'後第二次調用'instance()'嗎?在這種情況下,內存泄漏是可能的 – undefined

+0

您將不得不發佈一個小型可編譯的簡約代碼示例來說明問題。你發佈的代碼*如果使用正確*應該沒有泄漏,但只有*如果*,除非我們看到代碼,否則我們不知道。 –

+0

同時銷燬時,在destroy()方法中取消分配之前,請檢查_singleton是否爲null。 – Abhineet

回答

6

這裏有幾件事要注意。最明顯的是:你什麼時候 打電話Manager::destroy。第二件事是,內存valgrind 似乎是抱怨分配在構造函數 Manager,你沒有告訴我們。如果我們可以相信錯誤消息 (並且我通常發現valgrind在這方面是可靠的,但是它可以被愚弄),沒有剩餘的指向內存的指針; 要麼你不刪除對象中的一個字段,要麼 對象在其構造函數中分配內存,它不保存在 字段中。

最後,通常是更好的做法而不是來破壞一個單身人士。 單例成語的整個目的是爲了避免 初始化問題的順序(在C++中,至少—,否則只需聲明 該對象的靜態實例就足夠了)。破壞對象 引入了可能的破壞問題順序。如果你不破壞 它,valgrind會警告可能的內存泄漏(不是「definitly lost」);您可以忽略警告,也可以將其過濾掉。

+0

如果我不刪除_singleton當程序終止時我會有內存泄漏 – yotamoo

+1

@yotamoo在哪裏?在一個非常真實的意義上,程序終止時不存在內存泄漏等問題;系統將自動恢復所有內存。內存泄漏是程序使用越來越多的內存時,它運行的時間越長,並且它所使用的內存實際上並不需要。 –