DEBUG模式调试程序出现释放内存提示栈被破坏

sxjkk 2011-06-20 11:53:40

int bufLen = 0;
int bufIndex = 0;
int ulen = 0;
for(int i = 0;i < count;i++)
{
char *str = GetString(i);
bufLen = bufLen + strlen(str);
}
char *strBuf = (char *)malloc(bufLen * sizeof(char));
memset(strBuf, 0, strlen(strBuf));
for(int i = 0;i < count;i++)
{
char *str = GetString(i);
ulen = strlen(str);
ulen++;
memcpy(&strBuf[bufIndex], str, ulen - 1);
strBuf[bufIndex + ulen - 1] = '\n';
bufIndex += ulen;
}

//strBuf[strlen(strBuf) - 1] = '\0';

free(strBuf);


难道是申请的内存不足,还是什么造成的呢?
...全文
190 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
LZ,我对你的GetString(i)感兴趣,能否提供下源码
fox_ocean 2011-06-20
  • 打赏
  • 举报
回复
int bufLen = 0;
int bufIndex = 0;
int ulen = 0;
int count = 10;


for(int i = 0;i < count;i++)
{
char *str = "hello";
bufLen = bufLen + strlen(str) + 1;//这理要+1,strlen返回的长度不包括'\0'
//而你后面的意思我猜是想将这个'\0'用'\n'替代,也就是把得到的字符串
//换行输出。
}
//这里申请了50个单位的空间。PS:不要sizeof(char)也可以

char *strBuf = (char *)malloc(bufLen * sizeof(char));
//这里啊,这个时候啊,strBuf理还是一堆垃圾,strlen得到的也就是垃圾了。
//memory write 了改成
memset(strBuf, 0, bufLen);
//memset(strBuf, 0, strlen(strBuf));
for(int i = 0;i < count;i++)
{
char *str = "hello";
ulen = strlen(str);//这个是 5, 没有异议吧。
ulen++;//这里是6了。
//出错在这里 memory overwrite 了。为什么呢,继续看下面。
memcpy(&strBuf[bufIndex], str, ulen - 1);
strBuf[bufIndex + ulen - 1] = '\n';
//ulen 其实是6, 重复10次,那么bufIndex就到了54,比50大了很多的哦。
//其实是你忘记个'\n'申请空间了。
bufIndex += ulen;
}

//strBuf[strlen(strBuf) - 1] = '\0';//如果还要这一据的话,申请空间是还要+1

free(strBuf);
newfarmerchi 2011-06-20
  • 打赏
  • 举报
回复
难道是申请的内存不足,还是什么造成的呢?
-----------------------------------
可能是,已回答,请参考。
sxjkk 2011-06-20
  • 打赏
  • 举报
回复
Windows 已在 Test.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 Test.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 Test.exe 具有焦点时按下了 F12。

输出窗口可能提供了更多诊断信息。.


这个是VS2008提示的信息
sxjkk 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 q191201771 的回复:]
char *strBuf = (char *)malloc(bufLen * sizeof(char));
memset(strBuf, 0, strlen(strBuf));
strlen()是计数直到遇到'\0'
你现在strBuf申请的空间内全是未初始化的数据
应该memset(strBuf, 0, bufLen);
[/Quote]

谢谢,正解
就想叫yoko 2011-06-20
  • 打赏
  • 举报
回复
char *strBuf = (char *)malloc(bufLen * sizeof(char));
memset(strBuf, 0, strlen(strBuf));
strlen()是计数直到遇到'\0'
你现在strBuf申请的空间内全是未初始化的数据
应该memset(strBuf, 0, bufLen);
sxjkk 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 namelij 的回复:]
C/C++ code

for(int i = 0;i < count;i++)
{
char *str = GetString(i);
bufLen = bufLen + strlen(str)+1;//mark
}
char *strBuf = (char *)malloc(bufLen * sizeof(char));
……
[/Quote]

char *strBuf

这个就相当于一维数组
canghai5783281 2011-06-20
  • 打赏
  • 举报
回复
不许哦。这么难的
preciousboy 2011-06-20
  • 打赏
  • 举报
回复
mark~~围观
sxjkk 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lifesider 的回复:]
这样替换
memset(strBuf, 0, bufLen * sizeof(char));
应该就可以了
[/Quote]

感谢lifesider,正确答案
sxjkk 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fox_ocean 的回复:]
int bufLen = 0;
int bufIndex = 0;
int ulen = 0;
int count = 10;


for(int i = 0;i < count;i++)
{
char *str = "hello";
bufLen = bufLen + strlen(str) + 1;//这理要+1,strlen返回的长度不包括'\0'
//而你后面的意思我猜……
[/Quote]



感谢fox_ocean,问题好像就出在初始化char *strBuf = (char *)malloc(bufLen * sizeof(char));
memset(strBuf, 0, strlen(strBuf));
strlen(strBuf)不会得到正确的值,应该memset(strBuf, 0, bufLen); 这个方法,就能初始化正确



  • 打赏
  • 举报
回复

for(int i = 0;i < count;i++)
{
char *str = GetString(i);
bufLen = bufLen + strlen(str)+1;//mark
}
char *strBuf = (char *)malloc(bufLen * sizeof(char));
memset(strBuf, 0, strlen(strBuf));
for(int i = 0;i < count;i++)
{
char *str = GetString(i);
ulen = strlen(str);
ulen++;
memcpy(&strBuf[bufIndex], str, ulen - 1);
strBuf[bufIndex + ulen - 1] = '\0';//mark
bufIndex += ulen;
}

memcpy(&strBuf[bufIndex], str, ulen - 1);//mark,一维数组当二维数组用?

lifesider 2011-06-20
  • 打赏
  • 举报
回复
这样替换
memset(strBuf, 0, bufLen * sizeof(char));
应该就可以了
lifesider 2011-06-20
  • 打赏
  • 举报
回复
char *strBuf = (char *)malloc(bufLen * sizeof(char));
memset(strBuf, 0, strlen(strBuf));

malloc得出的strBuf通过strlen得出的大小可能大于bufLen * sizeof(char),从而memset操作越界,导致free的时候报错,堆写越界了
sxjkk 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 namelij 的回复:]
LZ,我对你的GetString(i)感兴趣,能否提供下源码
[/Quote]

StringArray.h

#pragma once
#include <string.h>

class StringArray
{
public:
StringArray(int strlen);
StringArray();
~StringArray(void);
void AddString(const char *str);
char *GetString(int index);
int GetLength();
void initArray(int length);
void PrintArray();
int GetCount();
char *WarpResultBuf();

private:
int length;
int count;
char **strings;
};



StringArray.cpp

#include "StdAfx.h"
#include "StringArray.h"

StringArray::StringArray(int strlen)
{
length = strlen;
strings = (char **)malloc(length * sizeof(char *));
count = 0;
}

StringArray::StringArray()
{
count = 0;
length = 0;
}

void StringArray::initArray(int length)
{
this->length = length;
strings = (char **)malloc(length * sizeof(char *));
}

StringArray::~StringArray(void)
{
int i = 0;
for(int i = 0;i < length;i++)
{
if(strings[i] != NULL)
{
free(strings[i]);
strings[i] = NULL;
}

}
if(strings != NULL)
{
free(strings);
strings = NULL;
}

}

void StringArray::AddString(const char *str)
{
if(length == 0)
return;

if(str != NULL && count < length)
{
char *temp = (char *)malloc((strlen(str) + 1) * sizeof(str));
memcpy(temp, str, strlen(str) + 1);
strings[count++] = temp;
}
}

char *StringArray::GetString(int index)
{
if(length == 0)
return NULL;

if(index < length)
{
return strings[index];
}
return NULL;
}
int StringArray::GetLength()
{
return length;
}

void StringArray::PrintArray()
{
for(int i = 0;i < length;i++)
{

}
}

int StringArray::GetCount()
{
return count;
}

char *StringArray::WarpResultBuf()
{
int bufLen = 0;
int bufIndex = 0;
int ulen = 0;
for(int i = 0;i < count;i++)
{
char *str = GetString(i);
bufLen = bufLen + strlen(str);
}
char *strBuf = (char *)malloc(bufLen * sizeof(char));
memset(strBuf, 0, strlen(strBuf));
for(int i = 0;i < count;i++)
{
char *str = GetString(i);
ulen = strlen(str);
ulen++;
memcpy(&strBuf[bufIndex], str, ulen - 1);
strBuf[bufIndex + ulen - 1] = '\n';
bufIndex += ulen;
}

strBuf[strlen(strBuf) - 1] = '\0';

return strBuf;
}


请参考

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧