内存释放.....这.........怎么会这样 能不能把这个函数WriteLine()贴全呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 paste all of your code : DWORD CTextFile::WriteLine(LPSTR m_str) . 已经free的内存块,再free就会出错。检查一下是不是重复free了(比如在某个调用函数里) 我看這句話又問題.CFile::Write(temp,strlen(temp))不是你寫了過多的數據,就使写入了非法数据。 完整代码如下DWORD CTextFile::WriteLine(LPSTR m_str){ int i=strlen(m_str); char *temp = (char *)malloc(i+2); memset(temp,0,strlen(temp)); strcpy(temp,m_str); temp[i]=0x0d; temp[i+1]=0x0a; CFile::Write(temp,strlen(temp)); free(temp); return 0;}调试环境下函数返回时,或执行到free(temp)时报错debug error!program myxxxx.exedamage: after normal block(#xxxx) 好像是内存块出了问题,到底是怎么一回事 error! memset(temp,0,strlen(temp)); 应该改为:memset (temp, 0, sizeof(temp)); sizeof(temp)求出的只是指針的長度,結果是4,不過不會引起錯誤。應該改為: int i=strlen(m_str); char *temp = (char *)malloc(i+3); temp[i+2]='\0'; memset(temp,0,strlen(temp)); temp[i]=0x0d; temp[i+1]=0x0a; CFile::Write(temp,strlen(temp)); free(temp); 这个方法也不保险啊,万一temp中间有个'\x0'呢明明已经知道了长度,为什么一定要多此一举再算,直接用不就可以了。 int i=strlen(m_str); char *temp = (char *)malloc(i+2); memset(temp,0,i+2 ); temp[i]=0x0d; temp[i+1]=0x0a; CFile::Write(temp,i+2 ); free(temp); DWORD CTextFile::WriteLine(LPSTR m_str){ int i=strlen(m_str); char *temp = (char *)malloc(i+2); memset(temp,0,strlen(temp)); strcpy(temp,m_str); temp[i]=0x0d; temp[i+1]=0x0a; CFile::Write(temp,strlen(temp)); free(temp); return 0;}出错语句: CFile::Write(temp, strlen(temp)); 改为: CFile::Write(temp, i); 即可!!因为字符串是以 NULL 即0x00 为结束标志,函数strlen()对字符串求长必须以NULL为结束标志,否则得出的结果不对,在对temp[i] 赋值后,字符串没有了结束标志,所以出错! 也可以多申请一个字节的空间,用以放 NULL。 若要把回车换行写入文件,用 CFile::Write(temp, i+2); 请问要使用 DHCPNOTIFYPROC 需要包含那个头文件?在线等,谢谢! 求君金玉良言 FindWindowEx()一问? 视图间的通讯 BHO设计COM问题救助 请教高手:如何使组合框在对话框弹出时有一个初始值? 如何在VC下使用加密狗?大侠帮帮忙 Onpaint()画的圆为什么看不到? 如何更换其它应用程序的光标??? error LNK2001: unresolved external symbol _IID_IDirectDraw4? 一个后学者的傻问题——对象的句柄到底是什末?是地址吗?和ID号有何不同?多谢? Shell问题:如何得到Windows系统最近的文档?
CFile::Write(temp,strlen(temp))
不是你寫了過多的數據,就使写入了非法数据。
DWORD CTextFile::WriteLine(LPSTR m_str)
{
int i=strlen(m_str);
char *temp = (char *)malloc(i+2);
memset(temp,0,strlen(temp));
strcpy(temp,m_str);
temp[i]=0x0d;
temp[i+1]=0x0a;
CFile::Write(temp,strlen(temp));
free(temp);
return 0;
}
调试环境下函数返回时,或执行到free(temp)时报错
debug error!
program myxxxx.exe
damage: after normal block(#xxxx) 好像是内存块出了问题,到底是怎么一回事
memset(temp,0,strlen(temp));
memset (temp, 0, sizeof(temp));
應該改為: int i=strlen(m_str);
char *temp = (char *)malloc(i+3);
temp[i+2]='\0';
memset(temp,0,strlen(temp));
temp[i]=0x0d;
temp[i+1]=0x0a;
CFile::Write(temp,strlen(temp));
free(temp);
明明已经知道了长度,为什么一定要多此一举再算,直接用不就可以了。
int i=strlen(m_str);
char *temp = (char *)malloc(i+2);
memset(temp,0,i+2 );
temp[i]=0x0d;
temp[i+1]=0x0a;
CFile::Write(temp,i+2 );
free(temp);
{
int i=strlen(m_str);
char *temp = (char *)malloc(i+2);
memset(temp,0,strlen(temp));
strcpy(temp,m_str);
temp[i]=0x0d;
temp[i+1]=0x0a;
CFile::Write(temp,strlen(temp));
free(temp);
return 0;
}
出错语句: CFile::Write(temp, strlen(temp));
改为: CFile::Write(temp, i);
即可!!
因为字符串是以 NULL 即0x00 为结束标志,函数
strlen()对字符串求长必须以NULL为结束标志,否则
得出的结果不对,在对temp[i] 赋值后,字符串没有
了结束标志,所以出错! 也可以多申请一个字节的空间,用以放 NULL。