注意(原則):永遠不要返回一個局部變量的指針或引用(其實是隱式的指針),可以返回局部變量本身,因為函數執行完之后,將釋放分配給局部變量的存儲空間,局部變量只是臨時的存儲空間,此時,對局部變量的引用和地址就會返回不確定的內存。
抓住這個原則,我們來看一下例子:
1.返回變量本身
//這個返回變量本身內存可以,正確 int add(int x, int y) { int sum = x + y; return sum; } int main() { int a = 3, b = 5; cout << add(a, b) << endl; }
2.返回局部變量指針,用法錯誤
int* add(int x, int y) { int sum = x + y; return ∑ } int main() { int a = 3, b = 5; cout << *add(a, b) << endl; }
會出現以下警告:
warning: function returns address of local variable [-Wreturn-local-addr]
return ∑
^
警告:函數返回地址是局部變量地址--->這是不安全的
該如何解決這種錯誤呢?
方案有以下3中常用方案:
1.使用靜態變量
2.使用全局變量
3.申請堆區變量
其實,使用這三種方法是為了延長變量的聲明周期,從而達到返回的地址是確定的而不是不確定的
法1:
int* add(int x, int y) { static int sum; sum = x + y; return ∑ }
int main() { int a = 3, b = 5; cout << *add(a, b) << endl; }
法2:
int sum; int& add(int x, int y) { sum = x + y; return sum; }
int main() { int a = 3, b = 5; cout << *add(a, b) << endl; }
法3:
int* add(int x, int y) { int* sum = new int; *sum = a + b; return sum; }
int main() { int a = 3, b = 5;
int *result;
result = add(a, b); cout << *result << endl;
delete result; }
但法3需要注意,由於用new申請的動態內存,調用者(這里是main)需要釋放這個申請的指針free, delete
參考:http://blog.chinaunix.net/uid-20788636-id-1841283.html