从匿名名称空间分配要映射的值,抛出std :: bad_alloc

时间:2018-08-20 15:48:41

标签: c++ stdmap

下面是错误代码,如std :: bad_alloc。我遇到错误 第 obj_ [key [i]] = value [i]; 行。请帮助我修复它。

 #include<iostream>
 #include<map>
  using namespace std;

 namespace {
         const std::string key1 = "s1";
         const std::string key2 = "s2";

         const std::string value1 = "v1";
         const std::string value2= "v2";
 }

 int main()
 {

         std::string key[3] = {
                 key1, key2};
          std::string value[3] = {
                  value1,value2 };
         std::map<std::string,std::string> obj_;

         for (size_t i = 0; i < sizeof(key); ++i) { // here its thow std::bad_alloc
                 obj_[key[i]] = value[i];
            }
}

4 个答案:

答案 0 :(得分:0)

sizeof(key)是数组的大小,以字节为单位。这不是元素的数量。

相反,您应该使用std::extent_v<decltype(key)>。 (需要#include <type_traits>。)

C ++ 17之前的版本:std::extent<decltype(key)>::value。 (也需要#include <type_traits>。)

如果这太适合您的口味了,那么还有一个穷人的选择:sizeof(key)/sizeof(key[0])

或者只是硬编码3

答案 1 :(得分:0)

sizeof(key) = 96(在OS 64位上)。要获取数组的大小,必须将该数字除以sizeof(std::string)(在OS 64位上为32):

for (size_t i = 0; i < sizeof(key) / sizeof(std::string); ++i) {
     obj_[key[i]] = value[i];
}

答案 2 :(得分:-1)

在此处不要使用sizeof(key)

for (size_t i = 0; i <  sizeof(key); ++i) { // here its thow std::bad_alloc
        obj_[key[i]] = value[i];
    }

编辑21.08.2018 使用(sizeof(key)/sizeof(*key))代替:

for (size_t i = 0; i <  (sizeof(key)/sizeof(*key)); ++i) { // here its thow std::bad_alloc
        obj_[key[i]] = value[i];
    }

答案 3 :(得分:-1)

使用sizeof()时,它返回对象的size in bytes,而不是您期望的元素数量。另外,在使用运算符[]时,您可以使用no bound check直接访问数组中的封装数据,这种组合可能是您的错误来源。 You can do the math并找出您有多少个元素。

由于您以前知道阵列的大小,因此可以改用std::array

std::array<std::string,3> key = {key1, key2, ""}; //you only used two values in your code
for (size_t i = 0; i < key.size(); ++i) {
  //your instructions
}

即使显式设置数组的大小,您仍然需要在循环中查询其大小,这有点奇怪。假设这是问题陈述的意外功能,并且您事先不知道其大小,我建议您改用std :: vector。