永远不要返回函数的局部变量的指针或引用,因为函数执行完之后,将释放分配给局部变量的内存,这段内存可能会被回收用作其他用途,也可能暂时不动,这是没法预测的。如果被回收用途其他用途了,那返回的指针就是一个野指针,要么读取的数据是错误的,要么出现内存访问异常错误。如果这段内存暂时还没被回收,那从指针读到的数据也还是正确的,但你没法预料下一秒是否会被回收了。
举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
#include <iostream> using namespace std;
int *sum(int number1, int number2) { int result = number1 + number2; return &result; }
int main() { int *result = sum(2, 3); cout<< "2 + 3 = " << *result<<endl; return 0; }
|
这段代码在我的电脑上运行就会出现段错误,程序异常终止。
那有时候我们真的需要返回一个局部变量的话,应该怎么办呢?有很多方法可以满足这种需求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
#include <iostream> using namespace std;
static int result; int *sum(int number1, int number2) { result = number1 + number2; return &result; }
int main() { int *result = sum(2, 3); cout<< "2 + 3 = " << *result<<endl; return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
#include <iostream> using namespace std;
int *sum(int number1, int number2) { int *result = new int; *result = number1 + number2; return result; }
int main() { int *result = sum(2, 3); cout<< "2 + 3 = " << *result<<endl; delete result; return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
#include <iostream> #include <memory> using namespace std;
shared_ptr<int> sum(int number1, int number2) { shared_ptr<int> result(new int); *result = number1 + number2; return result; }
int main() { shared_ptr<int> result = sum(2, 3); cout<< "2 + 3 = " << *result <<endl; return 0; }
|