【问题标题】:std::map<string, int> crashes when doing m[0] [duplicate]std::map<string, int> 在执行 m[0] 时崩溃 [重复]
【发布时间】:2019-10-16 08:07:46
【问题描述】:

以下崩溃:

  std::map<std::string, int> m1{ {"0", 0}, { "1", 1 }};
  // auto melem = m1["0"]; // OK
  auto melem = m1[0];

为什么会这样?

【问题讨论】:

  • 0 不是字符串。您为什么希望它起作用?
  • 为什么它不应该崩溃?对于给定的地图,operator[] 的参数必须为 key_type 类型。
  • basic_string( const CharT* s,const Allocator& alloc = Allocator() );:构造字符串,其内容初始化为 s 指向的以空字符结尾的字符串的副本。字符串的长度由第一个空字符确定。 如果 [s, s + Traits::length(s)) 不是有效范围(例如,如果 s 是空指针),则行为未定义.
  • @MatthieuBrucher 回答低于欢呼
  • @mkrieger1 公平地说,这样的“崩溃”在逻辑上是不可预料的。

标签: c++ c++11


【解决方案1】:

不幸的是(感谢 C!)从整数 0 构造 std::string 是“可能的”,因为它被视为 空指针文字

但是,it's not really possible:

使用由s 指向的空终止字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符确定。如果[s, s + Traits::length(s)) 不是有效范围(例如,如果s 是空指针),则行为未定义。

您遇到了崩溃,因为您尝试从空指针创建 std::string

至少with GCC the result 的这种合同违规是一个带有描述性名称的 [未处理] 异常:

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid

不幸的是,您不能依赖它,并且在构建过程中您不会收到任何警告。 ?

【讨论】:

  • 谢谢,这真的很有帮助。确实,没有警告,只是崩溃。我虽然这与地图有关,但实际上并非如此。执行 std::string s = 0 之类的操作足以使程序崩溃。谢谢!
  • @Korchkidu 没错:)
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多