2010-04-29 83 views
1

我有一個創建地圖數組的函數:C++:地圖的參考數組

map<string, int> *pMap 

以及將地圖寫入數組的函數:

int iAddMap(map<string, int> mapToAdd, map<string, int> *m, int i) 
{ 
    m = &(pMap[i]); 
    memcpy(m, mapToAdd, sizeof(map<string, int>)); 
} 

以及從數組中獲取地圖的函數

map<string, int>& getMap(int i) 
{ 
    return pMap[i]; 
} 

我可以毫無問題地將數據寫入數組,但每次調用都會導致seg錯誤:

int val; 
// val defined after this 
map<string, int> * pGetMap = &(getMap(val)); 

有關爲什麼會發生這種情況的任何建議?

+1

爲什麼不使用地圖的載體? – 2010-04-29 12:13:53

+3

「關於爲什麼會發生這種情況的任何建議?」是的。你迫切需要選擇一本基本的C++書籍並仔細閱讀。你的代碼沒有太大的錯誤,我不知道從哪裏開始。看到這裏:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list。 – sbi 2010-04-29 12:16:40

回答

8

您不能使用memcpy()複製地圖等實體,或者任何其他類型的C++容器 - 您需要使用賦值,該賦值考慮了映射的底層結構和se,mantics。你應該使用一個vector <map>,因爲你實際上似乎想要一個副本而不是指針。

3

這似乎是C和C++編程的一個邪惡的組合,開始發生變化:

memcpy(m, mapToAdd, sizeof(map<string, int>)); 

*m = *mapToAdd; 

另外在功能

int iAddMap(map<string, int> mapToAdd, map<string, int> *m, int i) 

的目的是什麼的m?在此功能之外不會看到對m的任何修改。

+0

你可能的意思是* m = * mapToAdd; – nothrow 2010-04-29 12:16:03

+0

@Yossarian感謝 – 2010-04-29 12:17:13

+0

這將矢量設置爲相同的地址。你可能是指與mapToAdd(運營商地址,而不是引用操作) – knittl 2010-04-29 12:17:16

4

永遠不要memcpy用於複製的地圖的對象(或其他類的,對於這個問題) - 使用轉讓或拷貝構造函數來代替。 memcpy是一個C函數,它沒有一個C++對象的內部結構的想法,所以它幾乎保證搞亂了。

而且你最好使用std::vector<map<string, int> >而不是數組:

std::vector<map<string, int> > maps; 

void addMap(const map<string, int>& mapToAdd, int i) 
{ 
    maps[i] = mapToAdd; 
} 

map<string, int>& getMap(int i) 
{ 
    return maps[i]; 
} 

注:addMap不會在你的示例代碼返回任何東西,所以我改變了它的返回類型void。此外,我通過mapToAdd作爲const引用而不是價值。