返回对局部变量的引用-C ++

时间:2019-12-14 20:47:44

标签: c++ variables reference

问题

如何返回对函数中局部变量的引用?

#include <stdio.h>

class Array {
    public:
        bool stillAlive;

        inline Array() : stillAlive{true} {}
        inline Array(Array& array) : stillAlive{array.stillAlive} {}
        /* Other constructors... */

        inline ~Array() { this -> stillAlive = false; }

        // My attempt at returning a local reference
        // doesn't work because `tmp` gets destructed after the function returns.
        inline Array& clone() {
            Array tmp;
            Array& arrayClone = tmp;
            return arrayClone;
        }
};

int main(void) {
    Array array {};
    Array clone {array.clone()};

    ::printf("array: %s\n", array.stillAlive ? "true" : "false");
    ::printf("clone: %s\n", clone.stillAlive ? "true" : "false");
    ::printf("array.clone(): %s", array.clone().stillAlive ? "true" : "false");

    return 0;
}

我见过static关键字,但我不希望引用始终是相同的变量。

通过指针,我知道可以在堆上分配内存,因此如果必须对值变量进行相同操作,我就可以了(但是我认为这不可能)。


  

编辑:尝试了一种可以使用自包含指针的解决方案。

尝试

那呢? 局部变量引用一个自包含的指针,该指针的作用范围超出其调用的功能范围。

#include <fcntl.h>
#include <stdio.h>

class Array {
    private:
        Array *cloneValue;

    public:
        bool stillAlive;

        Array() : cloneValue{NULL}, stillAlive{true} {}
        Array(Array& array) : cloneValue{NULL}, stillAlive{array.stillAlive} {}
        /* Other constructors... */

        ~Array() { delete this -> cloneValue; this -> stillAlive = false; }

        Array& clone() {
            delete this -> cloneValue;
            this -> cloneValue = new Array;

            Array& arrayClone = *(this -> cloneValue);
            return arrayClone;
        }
};

int main(void) {
    Array array {};
    Array clone {array.clone()};

    ::printf("array: %s\n", array.stillAlive ? "true" : "false");
    ::printf("clone: %s\n", clone.stillAlive ? "true" : "false");
    ::printf("array.clone(): %s", array.clone().stillAlive ? "true" : "false");

    return 0;
}

它似乎按预期工作,并且似乎也没有任何内存泄漏。

1 个答案:

答案 0 :(得分:3)

无法做到

改为返回局部变量的副本。

由于C ++ 11 move构造函数的神奇之处,通常会对其进行优化。我什至看过机器代码,它们本身都删除了移动,并像传递了指向接收移动的对象的指针一样操作该函数。

对于C ++ 11和更高版本,似乎最好进行编程,就好像副本是免费的。然后分析您的代码,如果确实存在复制问题,则可以对其进行优化。