通过引用函数传递映射时出错

时间:2013-04-18 13:37:21

标签: c++ map containers pass-by-reference

我想通过引用函数传递一个映射。 这是代码:

void test(map<int, double *> &a);

int main(){
    map<int, double *> a;
    test(a);
    cout << a[1][1] << endl;
    return 0;
}

void test(map<int, double*> &a)
{
    double red[] = {1.1, 2, 3};
    a[1] = red;
}

问题在于,[1] [1]应该是2.但是,当我执行程序时,它会给出一个像1.73e120这样的大数字!!!

4 个答案:

答案 0 :(得分:4)

你的地图将ints映射到指向double的指针。在函数内添加元素时,就像在此处一样,

a[1] = red; // points to first element of local red[] array

地图正在复制指向局部变量的指针。它指向的地址在test函数之外没有意义。指针不是数组,数组不是指针。

您可以通过使用向量映射来解决问题:

std::map<int, std::vector<double>>

然后

void test(std::map<int, std::vector<double>> &a)
{
  a[1] = std::vector<double>{1.1, 2., 3.};
}

答案 1 :(得分:4)

double red[] = {1.1, 2, 3};
a[1] = red;

危险!危险! red是一个局部变量,在test()返回后被销毁。不要存储指向函数返回后将使用的局部变量的指针。

你可以通过使其静态来解决这个问题,因为静态变量永远存在。

static double red[] = {1.1, 2, 3};
a[1] = red;

或者你可以动态分配内存:

double *red = new double[]{1.1, 2, 3};
a[1] = red;

答案 2 :(得分:4)

red定义创建的数组是test函数的本地数组。当函数结束时它将被销毁。您只是在map中放置了指向其第一个元素的指针,但该函数返回后该指针不再指向有效数组。数组消失,指针悬空。

可以动态分配数组,但这是一个巨大的痛苦,很可能导致内存泄漏和其他错误。

相反,我建议使用标准容器类型,例如std::vector

void test(map<int, std::vector<double>> &a)
{
    a[1] = std::vector<double>{1.1, 2.0, 3.0};
}

答案 3 :(得分:3)

double red[] = {1.1, 2, 3}; 

具有自动存储持续时间。这意味着当函数返回时它不再有效。

你应该做这样的事情

void test(map<int, double*> &a)
{
    double *red = new double[3];
    // fill up red.
    a[1] = red;
}