美文网首页
(九)C++篇-千万不要返回局部对象的引用和指针

(九)C++篇-千万不要返回局部对象的引用和指针

作者: GoodTekken | 来源:发表于2022-06-19 22:08 被阅读0次

    (1)千万不要返回局部对象的引用
    当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。考虑下面的程序:

    // Disaster: Function returns a reference to a local object
    const string &manip(const string& s)
    {
        string ret = s;
        // transform ret in some way
        return ret; // Wrong: Returning reference to a local object!
    }
    

    这个函数会在运行时出错, 因为它返回了局部对象的引用。 当函数执行完毕,字符串 ret 占用的储存空间被释放,函数返回值指向了对于这个程序来说,不再有效的内存空间。

    (2)千万不要返回局部对象的指针
    函数的返回类型可以是大多数类型。特别地,函数也可以返回指针类型。和返回局部对象的引用一样, 返回指向局部对象的指针也是错误的。 一旦函数结束,局部对象被释放, 返回的指针就变成了指向不再存在的对象的悬垂指针。

    (3)引用返回左值
    返回引用的函数返回一个左值。因此,这样的函数可用于任何要求使用左值的地方:
    测试代码如下:

    #include <iostream>
    #include <string>
    using namespace std;
    
    char &get_val(string &str, string::size_type ix)
    {
        return str[ix];
    }
    int main()
    {
        string s("a value");
        cout << s << endl;   // prints a value
        get_val(s, 0) = 'A'; // changes s[0] to A
        cout << s << endl;   // prints A value
        return 0;
    }
    

    输出结果:

    tekken@tekken:~/C++WS$ ./a.out 
    a value
    A value
    

    相关文章

      网友评论

          本文标题:(九)C++篇-千万不要返回局部对象的引用和指针

          本文链接:https://www.haomeiwen.com/subject/akhdvrtx.html