首页 > 代码库 > _strdup和strdup还有string.h和string事
_strdup和strdup还有string.h和string事
在MSVC中,_strdup(const char *p)函数的作用是返回一个指针,这个指针指向p的一个复制串。
#include<iostream> int main() { char str[]="this is a string"; char *dstring=strdup(str); std::cout<<dstring; std::cout<<(int)str<<" "<<(int)dstring<<std::endl; return 0; }
结果输出 :this is a string2488768 6066056。这是两个不同的地址,代表了调用strdup函数,返回的是一个复制串。但是,请注意进一步的分析。
同时,编译器还会提示:
warning C4996: ‘strdup‘: The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup.
这不是不是标准C的东西,要想避免warning,改用_strdup()。
这是_strdup()的源代码,可以看出参数一定不能为NULL,因为包含了strlen()
char * __strdup(const char *s) { size_t len = strlen(s) +1; void *new = malloc(len); if (new == NULL) return NULL; return (char *)memecpy(new,s,len); }
在MSVC的帮助文档可以找到提示,调用strdup后一定要free()释放内存,不然会内存泄漏。
但是,看下面的代码:
#include<iostream> int main() { char str[]="this is a string"; char *dstring=_strdup(str); delete str; std::cout<<dstring; std::cout<<(int)str<<" "<<(int)dstring<<std::endl; return 0; }
dstring复制str中的字符串后,删除str内容,再输出dstring。结果是:段错误!
而删除dstring,对str将没有任何影响。
请注意,上面的代码中都没有包含<string.h>,在VS2010中依然能够运行,答案还未找到。
在linux中,则必须#include<string.h>,并且,不能用#include<string>代替,不然会提示找不到strdup,加上std::strdup也没用(其实,这不是标准库的东西,加上std是错上加错。。。)
同时,g++编译,也不能使用_strdup代替strdup,因为_strdup是MSVC的东西。
对于,<string.h>和<string>,它们决不能等同。
时间有限,后面关于string.h和string的差异将在未来补上。