我看过一些海报说这strdup
是邪恶的.对此有共识吗?我使用它没有任何内疚感,并且没有理由比使用malloc
/ 更糟糕memcpy
.
我能想到的唯一可能strdup
是声名远扬的是调用者可能会滥用它(例如,没有意识到他们必须释放返回的内存;尝试strcat到strdup'ed字符串的末尾).但是,malloc的字符串也没有被滥用的可能性.
感谢对那些认为这个问题无益的人的回复和道歉(投票结束).总结一下这些答复,似乎没有普遍的感觉strdup
本身就是邪恶的,但是普遍的共识是它可以像C的许多其他部分一样被不恰当地或不安全地使用.
真的没有'正确'的答案,但为了接受一个,我接受了@nneoneo的答案 - 它同样可能是@R ..的答案.
nne*_*neo 32
我能想到的两个原因:
_strdup
),并且从技术上讲,C标准可以strdup
用不同的语义定义它自己的,因为str
它是保留的前缀.因此,它的使用存在一些潜在的可移植性问题.str
函数不分配内存,因此用户可能被误导(正如您所说)相信返回的字符串不需要被释放.但是,除了这些要点之外,我认为谨慎使用strdup
是合理的,因为它可以减少代码重复并为常见习语提供一个很好的实现(例如strdup("constant string")
获取文字字符串的可变,可返回副本).
P.P*_*.P. 20
我的答案是相当支持strdup
,它并不比C中的任何其他功能更糟糕.
POSIX是一种标准,strdup
如果可移植性成为问题,则实现起来并不困难.
strdup
如果有人花一点时间阅读手册页并了解其strdup
工作原理,是否释放分配的内存应该不是问题.如果一个人不理解一个函数是如何工作的,那么这个人很可能会弄乱一些东西,这适用于任何函数,而不仅仅是strdup
.
在C中,内存和大多数其他东西都由程序员管理,所以strdup并不比忘记释放 malloc
'ed内存,无法终止字符串,使用不正确的格式字符串scanf
(和调用未定义的行为),访问悬空指针等更糟糕.
(我真的想把它作为评论发布,但不能添加一条评论.因此,将其作为答案发布).
R..*_*R.. 10
我没有真正听说过strdup
被描述为邪恶,但有些人不喜欢它的一些可能的原因:
strdup
不会给你那个.我认为对strdup的大多数关注都来自于缓冲区运行和字符串格式不正确的安全问题.如果将非空终止字符串传递给strdup,则可以分配未定义的长度字符串.我不知道这是否可以专门用于攻击,但一般来说,良好的安全编码习惯只能使用占用最大长度的字符串函数,而不是单独依赖空字符.