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