首页 > 代码库 > _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的差异将在未来补上。