标准::字符串中的堆损坏

Heap corruption in std::string?

本文关键字:损坏 字符串 标准      更新时间:2023-10-16

我的代码失败并显示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 = '';
    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 是否有可能出现故障或任何其他程序导致问题?

损坏至少发生在 2 种情况下:

a) threadex.c(代码太长,无法发布)
b) free.cxstring调用(代码如上所示,太长无法发布更多)

首先,使用 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()已经存在。

你的错误在别的地方,而不是在这个函数里。

最有可能s和/或d已损坏。如果不看到更多的代码,就不可能知道为什么。如果我不得不猜测,我会认为它们的内存已经被释放了(例如,如果它们是类对象的一部分并且该类对象已经被删除)。或者,也许另一段代码做错了什么并覆盖了它们的内存。