c++引用一个按别名返回的堆中对象实例源码

c++引用一个按别名返回的堆中对象实例源码,要避免上文出现的内存泄露,我们就不能用按值的方式返回一个堆中对象,而必须按址返回或者按别名方式返回一个别名或者内存地址。这样就不会调用复制狗战术创建一个对象的副本,而是直接将该对象的别名或者地址返回。由于返回的对象的别名或者地址初始化给了main函数中的一个引用或指针,因此即使被调用函数中的局部指针超出作用于被系统释放,也可以在main函数中的引用或者指针找到该堆空间,不会令该空间成为不可访问的内存区域,从而避免了内存泄露。

#include <iostream>
using namespace std;
class A
{
public :
A(int i){cout<<”执行构造函数创建一个对象\n”;x=i;}
A(A&a){x=a.x;cout<<”执行复制构造函数创建一个对象\n”;}
~A(){cout<<”执行析构函数!\n”;}
int get(){return x;}
private:
int x;
};

A &func()//按别名返回
{
cout<<”跳转到func函数中!\n”;
A *p=new A(99);//创建堆中对象,该对象空间内没有使用delete删除,造成内存泄露
cout<<”堆中对象的地址:”<<p<<endl;
return *p;//返回对象值按值返回,这里会调用复制构造函数,复制对象a的一个副本
}

int main(){

A&r=func();//使用别名r接收返回的对象的副本
cout<<”堆中对象的副本的地址:”<<&r<<endl;//c++输出返回对象的地址
cout<<r.get()<<endl;//使用别名调用get函数输出成员函数
A *p=&r;
delete p;
return 0;
}

别名r与堆中对象的地址是相同的,r是堆中对象的别名,所以操作r就是对堆中对象的操作。 本文链接地址: c++引用一个按别名返回的堆中对象实例源码