从匿名命名空间映射的辅助值抛出 std::bad_alloc

Assiging value to map from anonymous namespace throw std::bad_alloc

本文关键字:std bad alloc 命名空间 映射      更新时间:2023-10-16

下面是通过错误的代码,如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];
}
}

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(在OS 64位上(。要获得数组的大小,您必须将此数字除以sizeof(std::string)(即 32(在 OS 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];
}