主:
char *tmpip;
tmpip = get_public_ip();
function get_public_ip:
char * get_public_ip(void){
char *ipresult;
if(((ipresult = malloc(17))) == NULL){
perror("malloc on pub ip");
exit(1);
}
if(fgets(ipresult, 16, tmpfp) == NULL){
perror("fgets error pubip");
exit(1);
}
fclose(tmpfp);
return ipresult;
}
我的问题是:
在主free(tmpip)
内进行是好事还是错了?
答案 0 :(得分:4)
这是一种很好的编码方式:你malloc()
函数中的一些内存,而free()
则不再需要它。请务必评论您的函数或原型malloc()
所需的内存,因此您知道必须free()
。
答案 1 :(得分:1)
为什么会出错?你实际上没有任何其他选项可以在其他地方释放分配的缓冲区...在C语言中调用一个分配内存的函数,然后使调用者(外部)函数可以释放该内存。
答案 2 :(得分:1)
如果使用动态分配,那么用free(tmpip)
释放指针肯定是好的!函数get_public_ip
只需要记录释放资源,调用者必须确保在返回值上调用free
。
另一种方法是提供一个函数void free_public_ip(char*buf) {free(buf);}
,并记录释放调用者必须使用的资源。这为您提供了一些灵活性,可以在不调用代码更改的情况下更改内存的分配方式。这当然没有必要。
在我看来,malloc
像这样的小型固定大小的缓冲区并没有多大意义。 get_public_ip
的标头文件可以#define PUBLIC_IP_SIZE (17)
并获取char*
参数,然后调用者可以执行此操作:
char tmpip[PUBLIC_IP_SIZE];
get_public_ip(tmpip);
// no more thinking required
而不是:
char *tmpip = get_public_ip();
// code here, perhaps does more things that could fail,
// maybe some thinking required to ensure every code path passes through:
free(tmpip);
如果这个号码17
将来没有机会重新编译调用代码(例如,如果这是一个库而你需要二进制兼容性),那么动态分配将是合理的。