我有一个创建地图数组的函数:
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));
有关为何发生这种情况的任何建议?
答案 0 :(得分:8)
你不能使用memcpy()复制像地图这样的对象,或者实际上任何其他类型的C ++容器 - 你需要使用赋值,它考虑了地图的底层结构和se,mantics。你应该使用vector <map>
,因为你实际上似乎想要一个副本而不是一个指针。
答案 1 :(得分: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引用而不是值传递。
答案 2 :(得分: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
的任何修改都不会在此函数之外看到。