c ++:地图的参考数组

时间:2010-04-29 12:10:54

标签: c++ segmentation-fault

我有一个创建地图数组的函数:

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));

有关为何发生这种情况的任何建议?

3 个答案:

答案 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的任何修改都不会在此函数之外看到。