从匿名命名空间映射的辅助值抛出 std::bad_alloc
Assiging value to map from anonymous namespace throw std::bad_alloc
下面是通过错误的代码,如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];
}
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- "std::vector"在调整大小时引发"bad allocation"异常
- 成员函数 bad() 的 std::ftsream 用于检查
- 正在使用std::string而不是char*bad
- 在抛出 'std::bad _alloc' 的实例后调用终止 what(): std::bad_alloc 在 c++ 中
- What is Scala for: getline(), std::cin.eof(), std::cin.bad()