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中的函数是全局的函数。

     

  • 相关阅读:
    [Java]lambda表达式
    [设计模式]访问者模式
    【Java】基本数据类型
    【JavaWeb】防止表单的重复提交
    [Java]异常在项目中的使用
    Java容器-个人整理1
    【MyBatis-Spring】Mybatis和并入Spring框架
    python 正则表达式模块——re 知识点小结
    关于使用python批量操作网络设备(交换机,路由器)的知识点小结
    GitHub 基础常用命令用法
  • 原文地址:https://www.cnblogs.com/wangpei0522/p/3782249.html
Copyright © 2011-2022 走看看