返回对象,无非两种方式,返回栈对象和堆对象指针,栈对象指针不能返回,因为可能使用不该使用的内存,堆对象也不能直接返回,因为会产生内存泄漏。下面,我们分析两种返回方式的优缺点,及针对缺点的解决方案。
这里有个注意点,返回this指针指向的自身对象时,可以返回引用。
返回栈对象:
优点:不用手动释放内存,避免了内存泄漏;
缺点:会产生对象拷贝,如果对象比较大,比如,对象里面有大数组,会产生性能开销。
返回堆对象指针:
优点:不会产生对象拷贝,对性能友好;
缺点:函数调用之后手动释放对象,代码管理难度和内存泄漏风险提高。
那有没有办法,把上面的缺点全克服了呢?有!
返回栈对象:用移动构造函数减少大对象拷贝;
返回堆指针:借助智能指针,避免内存泄漏。
注意:返回栈对象时,虽然很多编译器做了编译优化,即使不写移动构造函数,也不会产生对象拷贝,但是,为了应对还没有编译优化的编译器,建议写好移动构造函数。
可以看下面代码。
#include <iostream>
using namespace std;
class A{
public:
int i;
string* bigObj; //假设这是大对象
A(){
bigObj=new string("abc