我有这样的代码:我分配了两次日志,是否有潜在的内存泄漏的第一个&日志?
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);
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] 举报,一经查实,本站将立刻删除。