【问题标题】:Strange spontaneous run crash奇怪的自发运行崩溃
【发布时间】:2012-12-01 11:50:34
【问题描述】:

我的项目 atm 出现一些奇怪的错误和崩溃。

在我收到此消息的地方开始崩溃:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create

所以我开始添加一些 cerr 等来尝试找出它在哪一行崩溃。

现在我找到了崩溃行,尽管它没有打印出相同的错误代码。其实它什么也没说,就是崩溃。

导致崩溃的行是这样的:

Item* tempItem = new Item(name, id2, desc);

Item.h 构造函数如下所示:

Item(std::string name_, int itemId_, std::string description_ = "") 
: name(name_), itemId(itemId_), description(description_){}

我发送的变量如下所示:

string name = "Frying pan";
int id2 = 1;
string desc = "It's all rusty";

有什么想法吗? (如果您需要更多代码,请告诉我您需要什么,我会编辑它)

编辑 一些更新的信息:

name.max_size() = 1073741820
name.length() = 9

desc.max_size() = 1073741820
desc.length() = 14

EDIT2 我现在尝试在构造之前使用硬编码变量值来创建项目对象:

name = "itemName";
desc = "itemDesc";
id2 = 2;

它仍然在该行崩溃:

Item* tempItem = new Item(name, id2, desc);

【问题讨论】:

  • 调试器难道不会比在整个代码中散布cerr 消息更容易吗?
  • 有没有机会将负长度传递给字符串构造函数?
  • 如果你尝试创建一个字符串 t("something", -1);你可以得到同样的例外
  • 这是一个非常标准的堆损坏危险信号。

标签: c++ debugging crash


【解决方案1】:

std::string 的长度是有限制的。 std::length_error 超过该长度时抛出。实际限制取决于您的编译器对标准模板库的实现。

来自 C++ 标准 (19.2.4):

length_error 类将抛出的对象类型定义为 报告尝试生成长度的对象的异常 超过其最大允许大小。

您可以通过读取string::max_size 的值来检查允许的最大字符串大小。

【讨论】:

  • 嗯,是的,但我不再收到该错误。再说,“都生锈了”难道不应该在限度之内吗?它不像是一个长字符串。
猜你喜欢
  • 1970-01-01
  • 2013-11-16
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2023-02-02
相关资源
最近更新 更多