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

猜你喜欢

转载自blog.csdn.net/LG1259156776/article/details/80803798
今日推荐