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

Error in passing a map by reference to a function

本文关键字:映射 出错 引用 函数      更新时间:2023-10-16

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

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

问题是,a[1][1]应该是2。然而,当我执行程序时,它会给出一个很大的数字,比如1.73e120!!!

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;

red的定义创建的数组是test函数的本地数组。当功能结束时,它将被销毁。您只将一个指向map中第一个元素的指针,但一旦函数返回,该指针就不再指向有效的数组。数组不见了,指针一直悬着。

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

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

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

您的映射将int映射到指向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.};
}
double red[] = {1.1, 2, 3}; 

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

你应该做这样的

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