【C/C++開發】類物件作為返回值時析構的情況說明
阿新 • • 發佈:2019-01-24
class Person {
public:
string name;
public:
Person() {
name = "ttf";
}
~Person(){
cout << this->name <<endl;;
}
Person &changeName();
};
Person &Person::changeName() {
// Person p;
return *this;
}
int main() {
Person p;
Person p1 = p.changeName();
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
就是下面這個函式返回的是一個引用
因為返回是引用並且這個物件是外部定義的,所以返回引用沒有任何問題
Person &Person::changeName() {
return *this;
}
- 1
- 2
- 3
下面這個返回引用就會出問題
Person &Person::changeName() {
Person p;
return p;
}
- 1
- 2
- 3
- 4
問題在於,函式內部定義的物件,必須要在函式結束的時候回收。然而這個函式,卻把定義的物件本身返回了,導致函式內部定義的這個物件不能析構。導致記憶體洩露。
所以如果返回函式內部定義的物件一定不要返回引用
下面是正確的
這時返回物件p的副本,原來定義的p在函式結束以後就析構了
Person Person::changeName() {
Person p;
return p;
}