none
string能否作为形参 RRS feed

  • 问题

  • bool a(string str);不行,想问下,string能不能作为形参,老师能不能告诉我它为什么不能作为形参,百度了许久也没找到合适的答案
    2012年2月13日 6:59

答案

  • 您是将string类对象作为接口函数的参数传递到dll中?
    不要尝试越过模块边界传递内存管理类(如string、CString等等),应该转换成char*之类的标准数据类型再传递,每个模块都有属于自己的逻辑堆内存,一个模块中分配的内存在另一个模块看来是不存在的(无效的),每个内存块都有模块标记,系统会比较分配和释放时的模块是否相同。另外一个隐患是,不同模块使用的内存分配器可能是不一样的,所以必须维持一个原则,模块分配的内存必须由自己释放。换句话说,所有内置内存管理的封装类都不要作为参数跨模块传递。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年2月14日 1:46
    版主
  • 你好,

    您的意思是不是说当string 作为形参的时候,传入的值无法改变。例如

    #include <iostream>

    #include <string>

    using namespace std;

    void strtest(string str){

        string temp = "hello"; 

        std::cout << str << endl;                //显示为world

        str = temp;

        cout << str << endl;         // 显示为hello

    }

    void strtest2(string& str){

        string temp = "hello";

        std::cout << str << endl;                //显示为world

        str = temp;

        cout << str << endl;         // 显示为hello

    }

    int main(){

        string str = "world";

        strtest(str);

        cout << str << endl;         // 显示为world

        strtest2(str);

        cout << str << endl;         // 显示为hello

        return 0;

    }

    正如VisualEleven所说,在C++中模块都拥有自己的内存区域。所以如果您只是使用string
    作为参数传入。在主函数中的str并没有改变内容。



    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us

    2012年2月14日 7:21

全部回复

  • extern void print_the_string(std::string);//h文件中的函数声明,string作为形参


    void print_the_string(std::string value);

    { std::cout<< value;

    }




    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年2月14日 0:03
    版主
  • 你这么写抱什么错

    应该是没有问题的啊


    新浪微博http://weibo.com/xianglitian,欢迎围观

    2012年2月14日 0:57
  • 您是将string类对象作为接口函数的参数传递到dll中?
    不要尝试越过模块边界传递内存管理类(如string、CString等等),应该转换成char*之类的标准数据类型再传递,每个模块都有属于自己的逻辑堆内存,一个模块中分配的内存在另一个模块看来是不存在的(无效的),每个内存块都有模块标记,系统会比较分配和释放时的模块是否相同。另外一个隐患是,不同模块使用的内存分配器可能是不一样的,所以必须维持一个原则,模块分配的内存必须由自己释放。换句话说,所有内置内存管理的封装类都不要作为参数跨模块传递。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年2月14日 1:46
    版主
  • 你好,

    您的意思是不是说当string 作为形参的时候,传入的值无法改变。例如

    #include <iostream>

    #include <string>

    using namespace std;

    void strtest(string str){

        string temp = "hello"; 

        std::cout << str << endl;                //显示为world

        str = temp;

        cout << str << endl;         // 显示为hello

    }

    void strtest2(string& str){

        string temp = "hello";

        std::cout << str << endl;                //显示为world

        str = temp;

        cout << str << endl;         // 显示为hello

    }

    int main(){

        string str = "world";

        strtest(str);

        cout << str << endl;         // 显示为world

        strtest2(str);

        cout << str << endl;         // 显示为hello

        return 0;

    }

    正如VisualEleven所说,在C++中模块都拥有自己的内存区域。所以如果您只是使用string
    作为参数传入。在主函数中的str并没有改变内容。



    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us

    2012年2月14日 7:21