【发布时间】: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);你可以得到同样的例外
-
这是一个非常标准的堆损坏危险信号。