Ответ 1
В цитируемой ссылке в комментариях (http://open-std.org/JTC1/SC22/WG14/www/docs/n718.htm) дается объяснение о том, что "неправильно" о том, что strdup в стандартной библиотеке:
Основная проблема заключалась в желательности добавления функции в стандартную библиотеку, которая автоматически выделяет кучную память для пользователя.
В принципе, язык C и его стандартная библиотека стараются не делать предположений о том, как пользователь выделяет и использует память.
Это дает несколько возможностей, среди которых стек и куча.
В то время как malloc/free стандартизированы для динамического распределения памяти, они отнюдь не единственный способ сделать это, потому что управление динамической памятью является очень сложной темой, и стратегия распределения по умолчанию может оказаться нежелательной для всех видов приложений.
Существуют, например, несколько независимых библиотек, таких как jemalloc, что подчеркивает низкую фрагментацию и concurrency, или даже полноценные сборщики мусора, такие как Консервативный сборщик мусора Boehm-Demers-Weiser.
Эти библиотеки предлагают malloc/free реализаций, которые предназначены для использования исключительно в замене стандартным * alloc и бесплатным функциям от <stdlib.h>
без нарушения совместимости с остальной частью стандартной библиотеки C.
Итак, если strdup был стандартным, его было бы фактически дисквалифицировано от использования кода с использованием сторонних функций управления памятью (необходимо отметить, что вышеупомянутая библиотека jemalloc обеспечивает реализацию strdup, чтобы избежать этой проблемы).
В более общем плане, хотя strdup, безусловно, является практической функцией, он страдает от недостатка ясности в своей семантике. Это функция, объявленная в заголовке <string.h>
, но для ее вызова требуется, следовательно, освободить возвращенный буфер, вызвав функцию free
из заголовка <stdlib.h>
. Итак, это строковая функция или функция памяти?
Оставляя его в стандарте POSIX, кажется, является наиболее разумным решением, чтобы избежать меньшей ясности стандартной библиотеки C.