很容易以这种方式定义(C):
#include <string.h> char *strdup(const char *s) { size_t size = strlen(s) + 1; char *p = malloc(size); if (p) { memcpy(p,s,size); } return p; }
但即使是精明的程序员也可以很容易地弄错了.
此外,仅在没有该功能的系统上重新定义功能证明有点复杂,如下所述:strdup() function
为什么在C标准的修订版中不包括有用的广泛支持的功能? C99中C标准库中添加了很多新功能,不包括strdup的基本原理是什么?
解决方法
The major issue was the desirability of adding a function to the standard library which allocates heap memory automatically for the user.
基本上,C语言及其标准库尽量不要假设用户如何分配和使用内存.
它提供了一些设施,其中包括堆栈和堆.
虽然malloc / free对于动态内存分配是标准化的,但它们绝不是唯一的方法,因为动态内存管理是一个非常复杂的主题,默认分配策略对于各种应用程序来说可能不是理想的.
例如有一些独立的图书馆,如jemalloc,强调低碎片和并发,甚至是成熟的垃圾收集器,如The Boehm-Demers-Weiser conservative garbage collector.
这些库提供了malloc / free实现,它们专门用于替换< stdlib.h>中的标准* alloc和free函数.而不会破坏与C标准库的其余部分的兼容性.
因此,如果将strdup作为标准,则将有效地取消使用第三方内存管理功能的代码使用资格(必须注意的是,上述jemalloc库确实提供了strdup的实现来避免此问题).
更一般来说,strdup当然是一个实际的功能,它的语义缺乏清晰度.它是在< string.h>中声明的一个函数头,但调用它需要通过从< stdlib.h>调用免费函数释放返回的缓冲区.头.那么,它是一个字符串函数还是一个记忆函数?将其放在POSIX标准中似乎是避免使C标准库不太清楚的最合理的解决方案.