删除字符串时堆损坏

Bra*_*rad 2 c++ string heap stl cstring

这是我的代码:

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;
 }
Run Code Online (Sandbox Code Playgroud)

第一行读取字符串的长度.
第二行创建一个具有字符串长度
的新char数组(c-string)第三行读取字符串(从文件中读取它)
第4行在末尾添加NULL.
第5行从c-string中创建一个std :: string.
第6行删除了c-string(HEAP CORRUPTION HAPPENS HERE)
第7行返回字符串,但由于出错,它永远不会到达这一点.

在第6行,我遇到堆损坏错误:CRT检测到应用程序在堆缓冲区结束后写入内存.

我的问题可能很明显,但为什么我会出现堆腐败?当我创建一个std :: string时,它应该复制字符串,我应该可以安全地删除c-string.

目前,我怀疑std :: string在我删除它后试图访问c-string.

有任何想法吗?

Die*_*lla 8

您正在访问字符串的保留字节.你保留了strLen角色,但是放了一个\0角色strLen.从0开始计数为C数组,字符strLen位于位置strLen + 1,因此您在字符串的保留空间之外放置一个值.您应该strLen + 1在您的第二行保留main您的代码才能工作.