标签:
1 #include <iostream> 2 3 class Person 4 { 5 public: 6 Person(){} 7 8 void setAge(int age) { this->m_iAge = age; } 9 10 int getAge() { return this->m_iAge; } 11 12 private: 13 int m_iAge; 14 }; 15 16 Person* CreatePerson() 17 { 18 Person p; 19 20 return &p; 21 } 22 23 Person& CreatePerson2() 24 { 25 Person p; 26 27 return p; 28 } 29 30 Person* CreatePerson3() 31 { 32 Person *p = new Person(); 33 34 return p; 35 } 36 37 Person CreatePerson4() 38 { 39 Person p; 40 41 return p; 42 } 43 44 45 int main() 46 { 47 Person *pp = CreatePerson(); 48 pp->setAge(10); 49 std::cout << pp->getAge() << std::endl; 50 51 Person p = CreatePerson2(); 52 p.setAge(10); 53 std::cout << p.getAge() << std::endl; 54 55 Person *pp3 = CreatePerson3(); 56 pp3->setAge(10); 57 std::cout << pp3->getAge() << std::endl; 58 59 Person pp4 = CreatePerson4(); 60 pp4.setAge(10); 61 std::cout << pp4.getAge() << std::endl; 62 63 return 0; 64 }
代码有什么问题呢?
1 Person* CreatePerson() 2 { 3 Person p; 4 5 return &p; //错误。p为栈对象,函数返回时内存已释放,返回的指针为野指针 6 } 7 8 Person& CreatePerson2() 9 { 10 Person p; 11 12 return p; //错误。p为栈对象,函数返回时内存已释放,不能引用 13 } 14 15 Person* CreatePerson3() 16 { 17 Person *p = new Person(); 18 19 return p; //可以。p堆对象,不过要记得手动释放内存 20 } 21 22 Person CreatePerson4() 23 { 24 Person p; 25 26 return p; //正确。p为栈对象,函数返回会调用拷贝构造函数,重新拷贝一份。 27 }
C++常见误区1 -- 必须返回一个对象时不要试图返回一个引用
标签:
原文地址:http://www.cnblogs.com/99code/p/5664585.html