通过引用函数传递映射时出错
Error in passing a map by reference to a function
我想通过引用函数来传递映射。这是代码:
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;
}
相关文章:
- 在c++中访问int到类对象的映射时出错
- 将unique_ptrs从映射推送到矢量时出错
- 通过在迭代指针键映射上出错来捕获非确定性
- 不可复制的对象、映射和shared_ptr:复制构造函数中出错
- 使用映射<字符串,结构>类型的映射编译头文件时出错
- 初始化映射时出错
- 迭代映射以获取输入时出错
- 函数指针作为映射参数时出错?C++
- 声明矢量映射时出错
- 丢弃限定符 访问类中的映射向量时出错
- 在多重映射中将结构作为键传递时出错
- 使用 std::transform 打印映射<字符串、矢量<字符串*时出错> >
- C++中的无序映射出错
- 映射共享库时出错
- 编译 Caffe 时出错:ld:无法映射文件,errno=22
- 通过引用函数传递映射时出错
- 尝试存储映射插入的返回值时出错
- 遍历映射时出错<std::string, std::string>
- 使用std::string键从boost::无序::无序映射中恢复值时出错
- 初始化C++映射时出错