Core List
1. 返回局部对象的引用
(1) 返回 stack 局部变量
int& compute(int a, int b) {
int c = a + b;
return c; // c 是局部变量,但函数调用结束时,空间即释放
}
int result = compute(a,b); // 这里 result 是一个函数 compute 中 local 变量 c 的别名,因此得到的是垃圾数据
(2) 返回 heap 变量
int& compute(int a, int b) {
int *p = new int (a + b);
return *p; // p 指向的是 heap 上的内存空间,需要手动 delete
}
int result = compute (c, compute(a,b));
注:
a. 我们无法获取 compute(a,b) 结果对象的别名,因此无法手动 delete,导致内存泄露
b. 我们仅可以获取 compute (c, compute(a,b)) 结果对象的别名 result,进行 delete
2. 返回全局 static 变量
static int result
int& compute(int a, int b) {
result = a + b;
return result; // result 是全局变量
}
if ( compute(a, b) == compute(c, d)) { ... } // 改条件一直为真,同 a,b,c,d 的值无关
注:由于 compute(a, b) 和 compute(c,d) 的结果均为result。
3. 正确操作:返回一个新对象
int compute(int a, int b) { return a+b; }