关于系统函数传递字符串指针是否需要手动释放的问题
总是使用系统的函数直接返回的字符串指针,感觉非常方便,因为这样写出来的代码会非常简单。但从来没有想到是否需要释放的问题。但是等到自己写函数时就总是不敢把字符串指针直接返回,因为怕使用者忘记释放,而且也不符合“谁申请谁释放”的原则,于是在使用函数前只能首先申请内存,然后把内存地址和长度传入,才能得到完成函数调用。文字太枯燥,还是举个例子吧。
我要实现一个函数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);
第二种方法与第一种方法比较,显得特别繁琐,但如果按照第一种方法实现,就会出现我开头说的问题,由谁释放传出的指针,因为字符串要能够传出最普遍的做法就是申请堆空间。
不过经过一天的研究,也有人给出了一些答案,其中大多数人认为系统传出的字符串不需要手动释放是因为使用了静态局部变量,这个解释倒也能够说通,但是静态局部变量在函数调用后会一直存在,这在一定程度上会浪费内存,而且静态局部变量虽然在生命周期上能够满足要求,但是不安全,因为函数被再次调用后数据就会发生变化,而你也不知道什么时候函数会被再次调用。
这就是目前我的认识,不知道系统内部是不是就是这样实现的,如果是,可能会有点失望。
不知道大家平时遇到类似问题时是怎么解决的,我还看到有人说系统使用了进程数据空间,不知道有没有人听过。