堆std :: string中的堆坏了吗?

时间:2014-02-11 19:26:54

标签: c++

我的代码以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(上面显示的代码太长,无法发布更多内容)

2 个答案:

答案 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已损坏。没有看到更多的代码,就不可能知道原因。如果我不得不猜测,我认为他们的内存已被释放(例如,如果它们是类对象的一部分并且该类对象已被删除)。或者或许另一部分代码做错了并覆盖了他们的记忆。