内存释放问题..

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 需要 进行 释放吗,如果需要释放的话 该如何写 ?
...全文
218 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用释放

69,382

社区成员

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

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