• 全部
...

关于系统函数传递字符串指针是否需要手动释放的问题

xiaoyaoxiaonizi 2013-06-25 09:18:46
总是使用系统的函数直接返回的字符串指针,感觉非常方便,因为这样写出来的代码会非常简单。但从来没有想到是否需要释放的问题。但是等到自己写函数时就总是不敢把字符串指针直接返回,因为怕使用者忘记释放,而且也不符合“谁申请谁释放”的原则,于是在使用函数前只能首先申请内存,然后把内存地址和长度传入,才能得到完成函数调用。文字太枯燥,还是举个例子吧。
我要实现一个函数geterror,函数功能是返回上次出错的信息字符串。
1、系统函数一般的格式都是char *geterror();这样在调用时可以直接打印出错误信息printf("the error is : %s", geterror());
2、但是如果自己实现的话,就会变成这样了。首先函数格式为 bool geterror(char *buf, int len);调用时就显得更加繁琐了:
#define MAX_LOG_LEN
...
char log[MAX_LOG_LEN];
if(!geterror(log, MAX_LOG_LEN)){return;}
printf("the error is : %s", log);

第二种方法与第一种方法比较,显得特别繁琐,但如果按照第一种方法实现,就会出现我开头说的问题,由谁释放传出的指针,因为字符串要能够传出最普遍的做法就是申请堆空间。
不过经过一天的研究,也有人给出了一些答案,其中大多数人认为系统传出的字符串不需要手动释放是因为使用了静态局部变量,这个解释倒也能够说通,但是静态局部变量在函数调用后会一直存在,这在一定程度上会浪费内存,而且静态局部变量虽然在生命周期上能够满足要求,但是不安全,因为函数被再次调用后数据就会发生变化,而你也不知道什么时候函数会被再次调用。
这就是目前我的认识,不知道系统内部是不是就是这样实现的,如果是,可能会有点失望。
不知道大家平时遇到类似问题时是怎么解决的,我还看到有人说系统使用了进程数据空间,不知道有没有人听过。
...全文
给本帖投票
409 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2013-06-26
  • 打赏
  • 举报
回复
最简单的就是让用户传入buffer. 自己的程序可以用__thread线程局部存储来做.
短歌如风 2013-06-25
  • 打赏
  • 举报
回复
现在多数标准库中的函数都用TLS代替局部静态变量了,比如strtok。VC库分为单线程和多线程两个版本也是这个原因,单线程版不考虑并发冲突,速度要快不少。
短歌如风 2013-06-25
  • 打赏
  • 举报
回复
getxxxx的调用,一般是两种情况:一是使用全局变量表,适用于不变的信息,比如固定的错误信息。无论错误是否发生,这些信息永远存在、不变并且全局共享。你调用时直接根据错误代码找到相应的信息,把它返回给你。 另一种是使用线程级变量(TLS:thread local storage),每个线程有一个副本,互不干涉,适用于需要动态生成的信息。 至于自己写的代码如何处理这个问题,简单的一句“分配者释放”并不适用于所有情况,我的建议是:除了可以参考上面的两种方法以外,动态分配的可以规定一个共同使用的堆,函数中按需要分配,调用者负责释放。函数文档中要注明这一点,而且最好把函数命名为alloc_and_get_xxxx。 上一种方法比较简单,用起来方便,还有一种方法比较复杂,就是调用者提供回调函数,被调用者把数据一部分一部分地通过回调函数传回给调用者。至于调用者是增长内存块还是写入文件或发送到网络,完全不用关心。这种方式实现和使用都相对复杂一些,适用于数据量可能比较大的情况。
worldy 2013-06-25
  • 打赏
  • 举报
回复
好多api函数都是这样的格式: XXXX geterror(char *buf, int len);
AnYidan 2013-06-25
  • 打赏
  • 举报
回复
首先声明没有仔细研究过标准库: 1。返回字符串指针的如strcpy()等恰恰需要你输入char * 2. 返回字符串指针而没有要求你输入char *的函数一般用到了静态数据结构或全局变量 不可重入函数: (a) they are known to use static data structures, (b) they call malloc or free, or (c) they are part of the standard I/O library. Most implementations of the standard I/O library use global data structures in a nonreentrant way.
Sandrer 2013-06-25
  • 打赏
  • 举报
回复
像某些没有带参数的函数返回的指针,绝大部分都是用模块级的变量来做的 其实你不要以为微软的工程师有多厉害,真正厉害的是那些写底层的工程师 应用层的那些工程师,技术含量跟普罗大众没什么区别的 有时候由于工作压力的原因,写出来的代码还没有我们写的好呢

70,026

社区成员

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部