标准::字符串中的堆损坏
Heap corruption in std::string?
我的代码失败并显示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.c
由xstring
调用(代码如上所示,太长无法发布更多)
首先,使用 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
已损坏。如果不看到更多的代码,就不可能知道为什么。如果我不得不猜测,我会认为它们的内存已经被释放了(例如,如果它们是类对象的一部分并且该类对象已经被删除)。或者,也许另一段代码做错了什么并覆盖了它们的内存。
相关文章:
- 删除字符串后C++检测到堆损坏
- 检测到堆损坏(字符串导致堆损坏)|C++
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 字符串标记化期间的内存损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- 标准::字符串中的堆损坏
- C#到C代码P/调用多个std:字符串声明导致堆栈损坏
- 为了验证std::字符串是否已损坏,您将执行哪些调试验证
- 使用时间函数后,字符串已损坏
- 字符指针指向字符串,然后指向字符串数组。"./a.out"中的错误:malloc():内存损坏:0x0900c3b0***
- C++ - 删除标准::字符串*;堆损坏
- CPUID品牌字符串损坏
- 第二个字符串在多次重新分配调用后损坏
- Visual Studio 2008:字符串文字"??-"、"??'"、"??="损坏
- C++ iostream 使用字符串流的损坏
- 烟囱损坏;使用字符串进行位操作;MSVC++
- 从文件读取时字符串已损坏
- 按字符串堆损坏
- c# COM字符串在c++ BSTR中被损坏
- 变量损坏c++字符串Visual Studio 2005