如何返回对函数中局部变量的引用?
#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;
}
它似乎按预期工作,并且似乎也没有任何内存泄漏。
答案 0 :(得分:3)
您无法做到。
改为返回局部变量的副本。
由于C ++ 11 move构造函数的神奇之处,通常会对其进行优化。我什至看过机器代码,它们本身都删除了移动,并像传递了指向接收移动的对象的指针一样操作该函数。
对于C ++ 11和更高版本,似乎最好进行编程,就好像副本是免费的。然后分析您的代码,如果确实存在复制问题,则可以对其进行优化。