【转载】危险的strdup函数

	

《从缺陷中学习C/C++》第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题。使用库函数可以降低软件开发的难度,提高代码编写的效率。本节为大家介绍危险的strdup函数。

作者:刘新浙/刘玲/王超/李敬娜 等来源:人民邮电出版社| 2013-11-28 15:35

 
 

3.22 危险的strdup函数

3.22  危险的strdup函数

代码示例

     
     
  1. void printDup(char *str)  
  2. {  
  3.     char *tmp = strdup(str);  
  4.     printf("%s\n", tmp);  
  5. }  
  6. int main()  
  7. {  
  8.     char *ptr = "Hello World!";  
  9.     printDup(ptr);  
  10.     printf("Command to check memleak: valgrind --tool=memcheck--leak- check=yes ./a.out\n");  
  11.     return 0;  
  12. }  

现象&后果

程序运行一切正常,但用内存检查工具查看时,发现有内存泄漏发生,strdup分配的内存没有被释放。

Bug分析

这里的内存泄漏主要与strdup函数有关。strdup用来实现字符串复制,它的glibc参考实现如下:

     
     
  1. char * __strdup (const char *s)  
  2. {  
  3.   size_t len = strlen (s) + 1;  
  4.   void *new = malloc (len);  
  5.   if (new == NULL)  
  6.     return NULL;  
  7.   return (char *) memcpy (new, s, len);  
  8. }  

由strdup函数实现代码可以看到,strdup会自动分配内存空间,并复制字符串。但strdup只malloc了内存,并没有释放。释放strdup内部动态分配的内存需要由调用者去做,这点在strdup的man手册里明确提到。

一般大家都比较清楚malloc/free要成对使用,但strdup把动态分配内存的事实隐藏在自己内部,如果使用者不了解这个细节,就会造成内存泄漏。

正确的做法是,strdup返回的字符串在使用完之后要及时用free释放掉。

正确代码

     
     
  1. void printDup(char *str)  
  2. {  
  3.     char *tmp = strdup(str);  
  4.     printf("%s\n", tmp);  
  5.     free(tmp);  
  6. }  
  7. int main()  
  8. {  
  9.     char *ptr = "Hello World!";  
  10.     printDup(ptr);  
  11.     printf("Command to check memleak: valgrind --tool=memcheck--leak- check=yes ./a.out\n");  
  12.     return 0;  
  13. }  

编程建议

由于strdup函数有容易忘记释放内存的风险,不推荐使用它。如果想做字符串复制操作,建议直接使用malloc函数加memcpy函数。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值