内存释放问题..

binxiao 2008-09-24 11:34:53
内存释放问题....
不好意思没多少分了

函数:

int split(char* str,char seps[],char * ret[])
{
int i=0;
char *token;
token = strtok( str, seps );
while( token != NULL )
{
// printf( " 8888888 %s\n", token );
ret[i]=token;
token = strtok( NULL, seps );
//sprintf(ret[i],"%s", token);

i++;
}


delete token;
return i;
}

======================================

main()
{

char *msg[4]={NULL};
char *doc=(char *)malloc(strlen(lpContext->m_wsaInBuffer.buf)) ;
strcpy(doc, lpContext->m_wsaInBuffer.buf);


split(doc,"@",msg);
}
========================================
请问 msg 和 doc 需要 进行 释放吗,如果需要释放的话 该如何写 ?
...全文
266 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenpettle 2008-09-24
  • 打赏
  • 举报
回复
你是在哪儿Free的?
Split的动作是将Doc在@处拆分。
最终会得到01 202 11ww
waydream 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bitxinhai 的回复:]
doc是malloc的,肯定要释放,
msg只是一个栈空间的指针数组,
不用释放!!!
[/Quote]

注意 strtok 这个函数 使用了全局变量。
他的作用是把doc中的“@”用0替换,然后把下一个非“@”字符的地址返回给调用者。
所以split后 doc 变成01;
所以msg数组元素(指针)所指向的是doc 中的元素地址。
所以当free(doc)的时候 msg 指向的内容也无效了!!
如果再引用msg的话就会出错!!
如上所说
taojian_hhu 2008-09-24
  • 打赏
  • 举报
回复
那要看strok有没有将doc释放了
binxiao 2008-09-24
  • 打赏
  • 举报
回复
我开始用free(doc)时报 : after Normal block(#75) at 0x003b5b28

所以上来提问:

doc 在 split 前值是:01@202@11ww, split 后值是:01

所以我不明白 strok 处理了什么 ,为什么我不能 free();

==========================================


bitxinhai 2008-09-24
  • 打赏
  • 举报
回复
doc是malloc的,肯定要释放,
msg只是一个栈空间的指针数组,
不用释放!!!
lbh2001 2008-09-24
  • 打赏
  • 举报
回复
msg在栈上分配,不用自己释放
doc在堆上分配,需要手动释放,使用完doc后,free(doc);
HelloDan 2008-09-24
  • 打赏
  • 举报
回复
没有new和mollac的都不用释放的.
xzdwfwt111 2008-09-24
  • 打赏
  • 举报
回复
不用,函数用完自动释放
BeckhamXiao 2008-09-24
  • 打赏
  • 举报
回复
首先,关于释放的问题,3楼说的很清楚
第二、问题不出在strtok上,而是出在strcpy上,你把那个split函数注掉,效果也是一样的挂掉。原因是你分配的空间不够,strcpy的时候会在字符串的后面一个字节赋成0,比如说那个字符串是"12345",实际上strcpy操作了6个字节,虽然你分配了5个字节的空间。所以你free的时候会报错。解决办法是
doc=(char *)malloc(strlen(lpContext->m_wsaInBuffer.buf) + 1) ;
kkndciapp 2008-09-24
  • 打赏
  • 举报
回复
msg是栈上分配,有操作系统自动回收,不用自己去释放
doc是堆上分配,要自己去回收,否则会内存泄漏
hmsuccess 2008-09-24
  • 打赏
  • 举报
回复
doc必须得用free(doc)来释放
至于msg,在main结束时,就从栈中弹出来
a176835359 2008-09-24
  • 打赏
  • 举报
回复
msg不用释放,doc用释放
代码下载地址: https://pan.quark.cn/s/8236006bf1f9 Word精灵插件:一款用于增强Microsoft Word功能的辅助软件,能够将多种复杂功能转化为插件形式,并在软件状态栏中进行展示,涵盖诸如批注管理、表格处理、内容替换、文档拆分、数学运算、字符提取、批量重命名等多项实用工具。在工作环境中应用该插件能够显著降低工作强度,提升操作效率。Word精灵插件兼容32位与64位的Microsoft Word版本,支持Word 2007、2010、2013以及Word 2016操作系统,但不适用于Word 2003版本。此外,该插件同样支持WPS办公软件。 功能概述: 1、表格自动调整宽度:自动优化文档内所有表格的显示宽度。 2、批量导出批注信息:将文档内所有批注集中导出到Excel工作簿中。 3、表格至Excel多表导出:在将表格导出到Excel时,每个Word表格将独立存放在一个工作表中,Word文档内的表格数量与Excel生成的工作表数量相等,并附有工作表目录。 4、表格至Excel单表导出:将文档内所有表格整合后导出到一个Excel工作表中,多个表格将按顺序排列于同一工作表内。 5、统一图片分辨率:对指定文件夹内的所有图片进行分辨率标准化处理。 6、图片批量缩放:依据设定比例对图片进行放大或缩小,支持按百分比调整。 7、图片批量插入:将图片批量插入到当前文档,可选择图片名称的展示形式,并设定图片的高度。 8、图片格式统一转换:将指定文件夹内的所有图片转换为相同的文件格式。 9、内容批量替换:对文档内容、页眉及页脚执行批量替换操作,例如将数字1替换为字母A,数字2替换为字母B,数字3替换为字母C等。 10、图片批量导出:将文档内所...

70,039

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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