微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asprintf:如何释放指针?

我有这样的代码:我分配了两次日志,是否有潜在的内存泄漏的第一个&日志?

char *log = NULL; asprintf(&log,"Hello: %s",name); if (kNown_person== true){ asprintf(&log,"%s,%s",log,",my old friend."); } free (log);

分配给发送给方法的参数的大小

Linux内核互斥

为当前域创build一个安全标识符

问题产卵应用程序

什么是Mcrt1.o和Scrt1.o的用法

是的,代码将会泄漏,因为asprintf既不检查也不尝试重用以前的指针。 因此,内存简单地丢失了。 在你的例子中避免这个问题的最好方法是将代码重写为

char *log = NULL; if (kNown_person== true) asprintf(&log,"Hello: %s,my old friend.",name); else asprintf(&log,name); free (log);

这样,缓冲区被分配一次并正确释放。

或者,你可以使用两个指针

char *temp = NULL; asprintf(&temp,name); char *log = NULL; if (kNown_person== true) { asprintf(&log,temp); free( temp ); } else { log = temp; } free (log);

有没有[内存泄漏]

肯定是的。

对第一次调用aprintf()分配的内存的引用被第二次调用aprintf()覆盖,所以没有机会free()第一次分配的内存,它“泄漏”。

为了解决这个问题,引入了第二个(临时)指针:

char name[] = "C"; char * log = NULL; { char * log_tmp = NULL; asprintf(&log_tmp,name); if (kNown_person == true) { asprintf(&log,log_tmp,my old friend."); free(log_tmp); } else { log = log_tmp; } } /* Use log. */ free(log);

在这个问题上,一个不同的,可能更便宜的(更快,因为一些东西是在编译期间处理的,但是运行时间)方法如下:

#define FORMAT_STR "Hello: %s" #define FORMAT_SUFFIX_STR ",my old friend." ... char name[] = "C"; char * log = NULL; { char format[sizeof FORMAT_STR""FORMAT_SUFFIX_STR + 1] = FORMAT_STR; if (kNown_person == true) { strcat(format,FORMAT_SUFFIX_STR); } asprintf(&log,format,name); } /* Use log. */ free(log);

系统调用添加错误检查留给读者作为练习。

仅使用标准C函数的第三种方法是:

char name[] = "C"; char * log = NULL; { char * log_tmp = NULL; asprintf(&log_tmp,FORMAT_SUFFIX_STR); } { int s = snprintf(NULL,name); if (-1 == s) { /* failure */ } else { log = malloc(s + 1); if (NULL == log) { /* failure */ } else { if (-1 == sprintf(log,name)) { /* failure */ } } } } } free(log);

是。 可能asprinf不会击中相同的内存地点,并不知道以前的调用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐