Ниже приведен код ошибки через std :: bad_alloc. Я получаю сообщение об ошибке строка obj_ [ключ [i]] = значение [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];
            }
}
0
josp 20 Авг 2018 в 18:48

4 ответа

Лучший ответ

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.

0
HolyBlackCat 20 Авг 2018 в 16:18

sizeof(key) = 96 (на 64-битной ОС). Чтобы получить размер массива, вы должны разделить это число на sizeof(std::string) (32 (на ОС 64 бита)):

for (size_t i = 0; i < sizeof(key) / sizeof(std::string); ++i) {
     obj_[key[i]] = value[i];
}
0
KorelK 20 Авг 2018 в 16:18

Когда вы используете sizeof(), он возвращает размер в байтах объект, а не количество элементов, как вы, кажется, ожидаете. Кроме того, при использовании оператора [] вы получаете прямой доступ к инкапсулированным данным внутри массива с помощью проверка без привязки, эта комбинация, вероятно, является источником вашей ошибки. Вы можете сделать математику и выяснить, сколько элементов у вас есть.

Поскольку вы ранее знали размер своего массива, вы можете использовать вместо него 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.

-1
Vinícius Reis 20 Авг 2018 в 18:50

Не используйте 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];
    }
-1
lujobi 21 Авг 2018 в 06:18
51934340