Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问地图元素会增加它';s分配的内存大小_C++_Memory Management_Map - Fatal编程技术网

C++ 访问地图元素会增加它';s分配的内存大小

C++ 访问地图元素会增加它';s分配的内存大小,c++,memory-management,map,C++,Memory Management,Map,我的代码中有一个名为EU的map元素 我注意到,在我使用了机器上的全部可用内存(从~200 MB到~4GB)之前,代码的内存使用量会不断累积。注释掉代码中的内容,我得出结论,访问此映射中元素的一行就是注释掉的一行,它阻止了内存使用量的增加。 我使用[]运算符访问该值,我认为这可能是因为双精度值与映射中的值不完全相同。然后,我搜索了一个可能的案例: std::map<vector<double>,double>::iterator mit = EU.find(s);

我的代码中有一个名为
EU
map
元素

我注意到,在我使用了机器上的全部可用内存(从~200 MB到~4GB)之前,代码的内存使用量会不断累积。注释掉代码中的内容,我得出结论,访问此映射中元素的一行就是注释掉的一行,它阻止了内存使用量的增加。 我使用[]运算符访问该值,我认为这可能是因为双精度值与映射中的值不完全相同。然后,我搜索了一个可能的案例:

std::map<vector<double>,double>::iterator mit = EU.find(s);     
if (mit == EU.end()){
  for (int i = 0; i < 3; i++){
    O.w(s[i]);
  }
  cin.ignore();
}
std::map::iterator mit=EU.find(s);
if(mit==EU.end()){
对于(int i=0;i<3;i++){
O.w(s[i]);
}
cin.ignore();
}
这里的
O.w(s[i])
是我创建的i类中的一个函数,用于在屏幕上显示内容/写入硬盘。在这种情况下,它只是
printf(“%0.10f\n”,s[i])
,我使用
cin.ignore()
停止程序,以便检查输出。 这也会导致内存使用量的增加。 为什么会这样?我该如何防止这种情况


谢谢。

当您访问
std::map
中的元素时,如果索引没有关联值,则会创建一个新元素。因此,每次使用新键访问地图时,都会创建一个新节点来保存新的
std::vector
键和
double
值。

很抱歉-重读时,我很难理解您的问题/代码的作用。你介意发布真实代码/更多代码吗?这远远不够具体。(
O.w(s[i])
在那里几乎没有任何意义,并且
cin.ignore()
没有显示任何输入或多或少是荒谬的)我编辑了代码。我真的不确定我在问自己什么。我注意到内存消耗不断增加,我发现这是由于[]运算符引起的,我试图弄清楚这一点,在这个特定代码中,我没有看到任何会占用内存的东西。Vector的运算符
[]
不会做任何坏事。Map.find()不会做任何坏事。如果有问题,它会在其他地方(你可能是对的,双倍作为键是不好的,但话说回来,它会那么坏吗?)我想我已经明白了,双倍作为键是那么坏,因为我不能完全比较东西。我需要将其更改为整数,但这将花费我一些时间。。。谢谢。“我以为运算符<不是为标准序列定义的”--它是一个自由函数,它只是进行字典比较。@Benjamin Lindley:我在C++11标准中看到它,总是这样吗?“当你访问一个元素时”当你使用
[]
运算符访问它时,就是这样。当您使用
find()
或遍历元素时,就不会出现这种情况。