下面是错误代码,如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];
}
}
答案 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。