c map中使用自定義物件需要注意的問題

2021-09-03 08:40:05 字數 948 閱讀 2686

最近專案中遇到了乙個很有意思的錯誤,gdb除錯了半天通過檢視記憶體位址,找到了問題所在。

因為需要將乙個自定義的結構體對映到埠號上,因此使用了map來儲存。這個my_struct定義如下:

std::mapmy_map;

struct my_struct

//給map建立乙個新的鍵值對的過程如下

if(my_map.find(port_number) == my_map.end())

//下面的**便是對my_map[port_number]的操作

my_struct &s = my_map[port_number];

s.len = s.cur_ptr - s.buffer;

//按預先設想,my_struct中的len = cur_ptr-buffer;

//但是實際上並不是這樣,會發現len的值是乙個超級大的數,很明顯記憶體訪問越界了

//究竟是什麼原因呢?

錯誤的原因就在於上面if語句裡面的my_map[port_number] = temp;這一步。這個過程實際上分兩步,my_map[port_number]並不是真的指向temp這個物件,因為在if語句跳出之後,temp這個區域性變數就在棧中被清空了。因此temp的值實際上被拷貝到了my_map的棧記憶體空間中,而這個拷貝的過程是乙個記憶體拷貝的過程,參考結構體賦值,my_struct在這個拷貝的過程中屬於深拷貝,而cur_ptr屬於淺拷貝,buffer拷貝過程:memcpy(my_map匿名結構體的buffer, temp.buffer, 100)。my_map中的那個匿名結構體中的buffer不再和temp中的buffer指向同一塊記憶體區,但是兩者的cur_ptr的值確實相等的,這就導致了len計算錯誤。

建議將結構體中的buffer[100]陣列換成指標,如果對於記憶體管理覺得麻煩可以使用智慧型指標,其記憶體區域在外部動態申請,這樣上面的拷貝過程全是淺拷貝,buffer記憶體區域不會改變。

iOS中使用自定義字型

之前的好幾個專案,客戶都要求使用微軟雅黑字型,可是ios沒有自帶這個字型,腫麼辦 只能自己自定義字型了,下面是自定義字型的幾個重要步驟 需要注意的是,otf格式的檔案只能在ios5之後才能使用,所以假如你的系統需要在ios5.0之前的版本中使用的話,最好使用.ttf格式的字型檔案 2 在info.p...

spring中使用自定義註解

使用spring時,aop可以大幅度減少我們的工作量,這裡主要介紹一些spring中aop如何切註解。自定義註解 target retention retentionpolicy.runtime public inte ce myannotation 編寫切面類,切點在自定義註解上,切面類新增到sp...

Spark sparksql中使用自定義函式

中分別用物件導向和面向函式兩種寫法自定義了兩個函式 low2up 小寫轉大寫 up2low 大寫轉小寫 import org.apache.spark.sql.types.stringtype import org.apache.spark.sql.object sparksqlfunction s...