我的代码以Heap corruption in std::string?
string unsigned_int_to_string(unsigned int in)
{
using namespace boost::spirit;
using boost::spirit::karma::generate;
char x[65];
char *p = x;
generate(p, uint_, in);
*p = '\0';
return string(x);
}
void add(string &s, unsigned int in)
{
string d = unsigned_int_to_string(in);
s += d+":";
}
如果我在Windows 7 PC上运行我的程序,它可以正常工作,但它会在Windows 8.1 PC上的随机位置崩溃。为什么堆腐败,我根本就不明白?我的RAM是否有任何失败或任何其他程序导致问题?
至少有两起案件发生腐败:
a)threadex.c
(代码太长,无法发布)
b)由free.c
调用的xstring
(上面显示的代码太长,无法发布更多内容)
答案 0 :(得分:3)
首先,使用boost::spirit::karma::generate
返回字符串不需要首先使用字符缓冲区:
std::string unsigned_int_to_string(unsigned int value)
{
using namespace boost::spirit;
using boost::spirit::karma::generate;
std::string str;
generate(std::back_inserter(str), uint_, value);
return str;
}
可能发生的事情:代码中的某个地方,x
(是一个固定大小的非正化字符数组)正在超出其范围进行访问。这会导致你破坏记忆,之后就会发生任何事情。
如果没有发生这种情况,您可能会在代码的其他位置丢弃内存,从而导致行为不确定。
它的长短:你在代码中调用某处的未定义行为。
顺便说一句,如果您使用符合C ++ 11的编译器,std::to_string()
已经存在。
答案 1 :(得分:2)
您的错误在其他地方,而不是在此功能内部。
很可能s
和/或d
已损坏。没有看到更多的代码,就不可能知道原因。如果我不得不猜测,我认为他们的内存已被释放(例如,如果它们是类对象的一部分并且该类对象已被删除)。或者或许另一部分代码做错了并覆盖了他们的记忆。