C标准中不包括strdup的理由是什么?
大多数C程序员熟悉strdup函数.其中许多人认为是理所当然的,但它不是C标准(C89,C99和C11)的一部分.它是POSIX的一部分,可能不适用于所有环境.的确,微软坚持重命名它_strdup,增加了混乱.
很容易以这种方式定义(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的基本原理是什么? 解决方法
评论(
http://open-std.org/JTC1/SC22/WG14/www/docs/n718.htm)中引用的链接提供了关于在标准库中具有strdup的内容是“错误”的解释:
基本上,C语言及其标准库尽量不要假设用户如何分配和使用内存. 虽然malloc / free对于动态内存分配是标准化的,但它们绝不是唯一的方法,因为动态内存管理是一个非常复杂的主题,默认分配策略对于各种应用程序来说可能不是理想的. 例如有一些独立的图书馆,如jemalloc,强调低碎片和并发,甚至是成熟的垃圾收集器,如The Boehm-Demers-Weiser conservative garbage collector. 因此,如果将strdup作为标准,则将有效地取消使用第三方内存管理功能的代码使用资格(必须注意的是,上述jemalloc库确实提供了strdup的实现来避免此问题). 更一般来说,strdup当然是一个实际的功能,它的语义缺乏清晰度.它是在< string.h>中声明的一个函数头,但调用它需要通过从< stdlib.h>调用免费函数释放返回的缓冲区.头.那么,它是一个字符串函数还是一个记忆函数?将其放在POSIX标准中似乎是避免使C标准库不太清楚的最合理的解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |