zoukankan      html  css  js  c++  java
  • _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中的命名空间是std,而string.h中的函数是全局的函数。

     

  • 相关阅读:
    [TCP/IP] HTTPS的工作原理
    [TCP/IP] SSL的通讯原理
    ESLint笔记
    MacBook Pro维修过程
    论前端工程化
    听书,怅然若失
    js实现Mac触摸板双指事件(上/下/左/右/放大/缩小)
    Windows和Mac浏览器启动本地程序
    科目三(番禺化龙展贸东路)考试录20170224
    写jQuery插件该注意的
  • 原文地址:https://www.cnblogs.com/wangpei0522/p/3782249.html
Copyright © 2011-2022 走看看