C标准中不包括strdup的理由是什么?

前端之家收集整理的这篇文章主要介绍了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的内容是“错误”的解释:

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标准库不太清楚的最合理的解决方案.

原文链接:https://www.f2er.com/c/113644.html

猜你在找的C&C++相关文章