您的位置:首页 > 移动开发

CRT detected that the application wrote to memory after end of heap buffer

2015-07-23 15:40 537 查看
最近闲的无聊,把C++ STL中的string容器类自己尝试实现一遍,但是在写到insert()函数时,出现一个错误,就是CRT deceted that the application wrote to memory after end of heap buffer,最后上网看了些博客,自己调了下代码,解决了该问题。

一般的原因是对内存块进行不当的操作,比如字符串最后不加NULL或者'\0',导致程序释放内存时超出编辑;或者是写数据时超出申请的空间大小。

代码如下:

MyString& MyString::insert(unsigned int ipos,const char *stem)            //任意位置插入函数
{
MyString newString;
int iIndex;
if (ipos >= 0 && ipos < strlen(m_data))                               //ipos在范围内部
{
newString.m_data = new char[strlen(m_data) + strlen(stem) +1];     //申请空间
newString.m_end = m_data + strlen(m_data) + strlen(stem);
for (iIndex = 0;iIndex < strlen(m_data) + strlen(stem) -1;++iIndex)
{
if (iIndex < ipos)                                             //拷贝原始串  ipos前的数据
{
newString.m_data[iIndex] = m_data[iIndex];
}
else
{
if (iIndex >= ipos && iIndex < (ipos + strlen(stem)))     //添加子串
{
newString.m_data[iIndex] = stem[iIndex - ipos];
}
else                                                      //添加原来字符串后边的串
{
newString.m_data[iIndex] = m_data[iIndex - strlen(stem)];
}
}
}
newString.m_data[iIndex] = NULL;                                      //最后一位置空 表示字符串结束
}
*this = newString;
return *this;
}


在第一个for循环处,我用的strlen(newString.m_data) - 1,而此时newString空间中,只申请了空间,并没有数据,也没有字符串结束标志,所以这个for循环就会访问越界,导致问题出现。修改方法是,将这一句话改为:

for(iIndex = 0;iIndex < strlen(m_data)+strlen(stem);++iIndex)就好了。

总结:(1)对内存操作一定要细心,最好多分配一个字节的内存。

(2)如果出现问题,加断点调试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: