2009-11-10 95 views
2

我有一個內存泄漏問題,它實際上是從以下結構排列形成:奇怪的內存泄漏

TagStruct TagData [] = 
{ 

    { Tag_SecurityToken, string("x-abc-security-token"), string("ab-security-token") } , 
    { Tag_XYZ, string("x-abc-xyz"), string("ab-xyz") }, 
    { Tag_ChunkCount, string("x-abc-meta-chunk"), string("ab-meta-chunk") }, 
    { Tag_OriginalFileSize, string("x-abc-meta-totalsize"), string("ab-meta-totalsize")} 

}; 

奇怪的是當然的內存泄漏問題,而最古怪的問題是,當我關閉客戶端VS轉儲第一個,第三個和第四個元素,但不轉儲第二個元素(Tag_XYZ)。內存泄漏似乎產生在第一次運行之前,我甚至調用數組,記住,我只使用數組用於檢查的目的裸:

string Get_Tag (Tags tag) 
{ 
    return m_ClientType == CType_ABC ? TagData[tag].strABC : TagData[tag].strAB; 
} 

那實際上整個的原因吧。所以沒有任何內聯堆/內存分配。

也是標籤結構看起來某事像這樣:

struct TagStruct 
    { 
     Tags tag; 
     std::string strABC; 
     std::string strAB; 
    }; 

我也想讓你知道,這是一個全球性的數組,我自己也嘗試使其靜止的,而是不斷收到內存泄漏,也我試過聲明數組中的字符串爲"str",而不是string("str"),但不斷收到內存泄漏。是的,內存泄漏是靜態的,這意味着它不會隨着時間的推移而建立,但仍然更好地保持乾淨的代碼。有什麼建議麼??

+0

錯誤..我沒有看到泄漏..你確定嗎? – 2009-11-10 08:41:28

+0

好吧,這就是VS說的,坦率地說,我也沒有真正看到泄漏,這就是爲什麼我用「怪異」這個詞 – 2009-11-10 08:43:23

回答

7

這是一個錯誤泄漏的例子 - 泄漏檢測器發現分配的內存在檢測器運行時沒有被釋放。但是檢測器在靜態對象析構函數之前運行,因此在釋放內存之前運行。這就是爲什麼它從檢測器的角度來看是泄漏的,但它並不是真正的泄漏。

+0

認爲我的自我,但我想檢查... – 2009-11-10 08:45:50

+0

我也想知道爲什麼VS只轉儲數組的第一,第三和第四個元素而不是第二個? – 2009-11-10 08:47:22

+0

@紅蛇所以作爲一種解決方法,您可以通過將結構放入Get_Tag函數來使結構非靜態。我不知道編譯器可以做什麼來優化,但我的猜測是,沒有巨大的性能影響。 – foraidt 2009-11-10 08:58:38

1

這是一個虛驚,但即使它不是,它不會有任何意義, 是一個全局(或靜態)變量,這個數組的空間在編譯時計算和分配,存儲在數據段,這個內存永遠不會被釋放。 當內存在運行時動態分配而未被釋放時發生內存泄漏