这是我的代码:
std::string readString()
{
int strLen = Read<int>();
char* rawString = new char[strLen];
Read(rawString, strLen);
rawString[strLen] = '\0';
std::string retVal(rawString);
delete [] rawString;
return retVal;
}
第一行读取字符串的长度。
第二行创建一个新的字符数组(c-string),其长度为字符串
第三行读取字符串(从文件中读取)
第 4 行在末尾添加 NULL。
第 5 行从 c 字符串创建一个 std::string。
第 6 行删除 c 字符串(HEAP CORRUPTION HAPPENS HERE)
第 7 行返回字符串,但由于错误,它永远不会到达这一点。
在第 6 行,我收到堆损坏错误:
CRT 检测到应用程序在堆缓冲区末尾后写入内存。
我的问题可能很明显,但为什么我会出现堆损坏?当我创建 std::string 时,它应该复制该字符串,并且我应该可以安全地删除 c 字符串。
目前,我怀疑 std::string 在删除 c 字符串后试图访问它。
有任何想法吗?
您正在访问超过字符串的保留字节。您已预订strLen
字符,但放一个\0
在角色处strLen
。从 0 开始计数,字符strLen
处于位置strLen + 1
,因此您将一个值放在字符串的保留空间之外。你应该预约strLen + 1
在你的第二行main
让您的代码正常工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)