1. 程式人生 > >【C/C++開發】類物件作為返回值時析構的情況說明

【C/C++開發】類物件作為返回值時析構的情況說明

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;
}