码迷,mamicode.com
首页 > 其他好文 > 详细

_strdup和strdup还有string.h和string事

时间:2014-06-12 14:26:37      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   java   http   

在MSVC中,_strdup(const char *p)函数的作用是返回一个指针,这个指针指向p的一个复制串。

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

结果输出 :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()

bubuko.com,布布扣
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);  
} 
bubuko.com,布布扣

在MSVC的帮助文档可以找到提示,调用strdup后一定要free()释放内存,不然会内存泄漏。

但是,看下面的代码:

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

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的差异将在未来补上。

 

_strdup和strdup还有string.h和string事,布布扣,bubuko.com

_strdup和strdup还有string.h和string事

标签:style   class   blog   code   java   http   

原文地址:http://www.cnblogs.com/wangpei0522/p/3782249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!