Ниже приведен код ошибки через 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];
}
}
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
.
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];
}
Когда вы используете 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.
Не используйте 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];
}
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который будет скомпилирован с помощью компилятора C ++). Используйте тег, зависящий от версии, для вопросов, связанных с конкретной редакцией стандарта [C ++ 11], [C ++ 14], [C ++ 17] или [C ++ 20] и т. Д.