2016-11-29 25 views
0

在堆上聲明std :: unordered_map,在它上執行一些操作,然後釋放它的語法是什麼?我做:std :: unordered_map <int32_t,int32_t>在堆上聲明

std::unordered_map<int32_t, int32_t> *map_temp_last_close = new std::unordered_map<int32_t, int32_t>; 
*(map_temp_last_close[val]) = *(int32_t*)(read_buffer + 30); //this happens multiple times in a loop 
int32_t some_val = val * (*(map_temp_last_close[val])) 
map_temp_last_close->clear(); 
delete(map_temp_last_close); 

編輯: 爲什麼我需要把它在堆上?我有一個始終運行的功能,不斷接收來自網絡的數據,並且在某些情況下,將數據存儲在地圖中以處理它。一旦地圖的使用結束後,我知道我不會再收到我的協議中的消息,因此不需要地圖,但由於該函數處於無限循環中,因此地圖未超出範圍(當從網絡上讀取)。所以我想通過撥打freedelete或其他東西來釋放內存。

+3

爲什麼你需要在堆中做這個?爲什麼不在堆棧中? –

+0

@SergeRoussak請參閱編輯。 – user2635088

+2

@ user2635088:本地堆棧變量(形式上,具有自動存儲持續時間的本地化)在封閉範圍的末尾被銷燬,該範圍可以小於函數。使用'{}'在函數內創建一個範圍。或者,只需在'map'上調用'clear()',就可以恢復重要的資源(sizeof(unordered_map)'可以忽略不計,這是相關的堆數據可能足夠大值得關注,並且clear()應該注意這一點)。 –

回答

2

你的錯誤是大括號的定位。您必須首先將解除引用,然後將索引到數據結構中。

我也不會把它放在首位,因爲std::unordered_map已經將它的數據存儲在內部的堆中,但是如果你真的需要,我能想到的最簡單和最安全的方式是這樣的::

auto map_temp_last_close = std::make_unique<std::unordered_map<int32_t, int32_t>>() 
(*map_temp_last_close)[val] = *(int32_t*)(read_buffer + 30); 
int32_t some_val = val * (*map_temp_last_close)[val]; 

//map object will get destroyed automatically when map_temp_last_close goes out of scope, but if you want to delete it earlier, you can use: 
map_temp_last_close.reset(); 

這在堆上創建一個std::unordered_map和本地unique_ptr變量管理它:每當map_temp_last_close超出範圍時,它會自動刪除(通過迴歸,異常或者僅僅因爲在當前範圍結束吧)地圖。此外,在銷燬之前沒有理由致電clear,因爲地圖會自動執行此操作。

注:
最有可能(取決於read_buffer的類型)這個表達式:*(int32_t*)(read_buffer + 30)是不確定的行爲。

+0

謝謝。所以'read_buffer'是char數組,它在調用'recv'時從網絡接收字節時填充。如果網絡協議規定在該位置會有一個int32_t,這是否仍然是未定義的行爲?我知道,如果我讀的'int32_t'值超出了某個範圍,那麼在協議中有一個錯誤,我可以相應地處理這種行爲 – user2635088

+0

@ user2635088:是的,它有兩種未定義的行爲,首先是違規嚴格別名,其次是違反對齊('30'不是'sizeof(int32_t)'的倍數)。使用'memcpy(&some_val,read_buffer + 30,4)'取而代之。如果你有一個容錯的平臺,編譯器將產生一個32位的移動,每個位的移動速度都和原始的一樣高效,但是這個行爲是正式定義好的。在對齊很重要的平臺上,你會得到有效的代碼。 –

+0

@BenVoigt我可以使用'memcpy'複製到(* map_temp_last_close)[val]中嗎?它會是'memcpy(&((* map_temp_last_close)[val]),read_buffer + 30,4);'? – user2635088

相關問題