2014-04-07 87 views
1

我具有以下C++代碼C++的std ::圖存儲器管理

map<long, TelemInfoV01> LastTelemetry; 

void UpdateTelemetry(const TelemInfoV01 &info) 
{ 
    LastTelemetry[info.mID] = info; 
} 

其中TelemInfoV01是一個結構

的UpdateTelemetry方法被稱爲我的代碼以外,傳遞的值,該餘緩存和使用後來。地圖如何管理內存?它是否以相同的方式複製結構,從全局LastTelemetry映射中刪除後是否必須手動刪除它?

我不控制進入方法的'info'變量的範圍。我只是想緩存它的價值在不同的調用中使用它。

問的主要原因是我有一些內存泄漏並希望追蹤它。

感謝, 斯特沃

+6

該地圖保留自己的鍵和值的副本。你不必擔心任何事情。 – juanchopanza

+2

使用'valgrind'或'vld'來跟蹤內存泄漏。否則,在任何地方使用原始指針都是一個很好的起點。 – OMGtechy

+0

確保'TelemInfoV01'在複製構建,複製分配和破壞時正確運行。 –

回答

2

的UpdateTelemetry方法被稱爲我的代碼外,路過 值,我緩存,然後再使用。地圖如何管理內存?

如果TelemInfoV01正確實現,那麼地圖將保留它自己的類實例副本,那麼您不必擔心內存泄漏。如果你在內部分配了一些內存,那麼你必須遵循rule of three來防止內存泄漏,但是它仍然更好地將指針放在智能指針內(所謂的rule of zero)。

是它在複製同樣的方式結構,我已經從全球LastTelemetry地圖中刪除後手動刪除它 ?

你不必擔心,你的結構被從地圖中刪除後,析構函數將被調用它,它會被正確銷燬。所以,對於內存泄漏,您必須在struct構造函數中分配一些空指針,然後忘記在析構函數中刪除它。

如果你的緩存是一個全局變量,那麼一旦你從你的主體返回,它將被銷燬。所以如果你檢查內存泄漏的主要目的,你的緩存可能看起來像內存泄漏。

1

問題地圖如何管理內存?

A map並沒有做任何特殊的事情來管理內存。

Q它以某種方式複製結構?

A是的,它的確如此。

mapoperator[]函數被定義,如:

mapped_type& operator[] (const key_type& k); 

表達LastTelemetry[info.mID]計算結果爲TelemInfoV01&。這意味着線

LastTelemetry[info.mID] = info; 

類似於上TelemInfoV01(如a = b;)調用賦值運算符。地圖中存儲info的副本。

問題從全局LastTelemetry映射中刪除後,是否必須手動刪除它?

A不可以。因爲你的地圖保存着對象,所以當地圖被破壞時它們會被破壞。如果您選擇存儲指向TelemInfoV01而不是對象的指針,則必須格外小心才能釋放內存。