65,199
社区成员




A& return_A()
{
A *a = new A();
return *a;
}
然后A& a2=a1.return_A();
之后delete &a2;
不过在return_A里最好用安全指针,比如unique_ptr<A> a(new A());
return *a;
然后就不用手动delete了。#include<iostream>
#include<iomanip>
using namespace std;
class A
{
private:
const char* _s;
public :
A(const char* s):_s(s)
{
cout<<"constructor:";
if(s)
cout<<s;
cout<<endl;
}
A(const A& a)
{
_s=a._s;
cout<<"copy constructor:";
if(_s)
cout<<_s;
cout<<endl;
}
A(A&& a)
{
_s=a._s;
a._s=nullptr;
cout<<"move constructor:";
if(_s)
cout<<_s;
cout<<endl;
}
~A()
{
cout<<"destructor:";
if(_s)
{
cout<<_s;
_s=nullptr;
}
cout<<endl;
}
A& return_A(const char*s)
{
cout<<"return_A start"<<endl;
A* a=new A(s);
cout<<"return_A end"<<endl;
return *a;
}
const char *getString()
{
return _s;
}
};
int main()
{
cout<<"start"<<endl;
A a1("a1");
cout<<"call return_A start"<<endl;
A& a2=a1.return_A("a1->a2");
cout<<"call return_A end"<<endl;
cout<<"a2._s("<<setbase(ios::hex)<<setw(sizeof(size_t)*2)<<setfill('0')
<<(size_t)a2.getString()<<") == "<<(a2.getString()?a2.getString():"nullptr")<<endl;
delete &a2;
cout<<"a2._s("<<setbase(ios::hex)<<setw(sizeof(size_t)*2)<<setfill('0')
<<(size_t)a2.getString()<<") == "<<(a2.getString()?a2.getString():"nullptr")<<endl;
cout<<"end"<<endl;
return 0;
}
/*
output:
start
constructor:a1
call return_A start
return_A start
constructor:a1->a2
return_A end
call return_A end
a2._s(17232304) == a1->a2
destructor:a1->a2
a2._s(00000000) == nullptr
end
destructor:a1
*/
因为成员函数返回的是引用,定义的a2也是引用类型,所以不会产生新的对象。[/quote]
刚才引用错了···
不好意思,早上有事情,所以这个帖子看的比较匆忙,我当时只是复制了LZ的的代码在调试,然后看到你写的第一个把函数的返回值改成引用类型,没看到把a2也改成了引用,所以出了点误会,不好意思,这位同学。我刚才试了一下,引用是可以的,而且我也对比了引用和指针两种实现的反汇编,发现也是基本一致的,这说明使用你说的引用也可以达到释放内存的目的。#include<iostream>
#include<iomanip>
using namespace std;
class A
{
private:
const char* _s;
public :
A(const char* s):_s(s)
{
cout<<"constructor:";
if(s)
cout<<s;
cout<<endl;
}
A(const A& a)
{
_s=a._s;
cout<<"copy constructor:";
if(_s)
cout<<_s;
cout<<endl;
}
A(A&& a)
{
_s=a._s;
a._s=nullptr;
cout<<"move constructor:";
if(_s)
cout<<_s;
cout<<endl;
}
~A()
{
cout<<"destructor:";
if(_s)
{
cout<<_s;
_s=nullptr;
}
cout<<endl;
}
A& return_A(const char*s)
{
cout<<"return_A start"<<endl;
A* a=new A(s);
cout<<"return_A end"<<endl;
return *a;
}
const char *getString()
{
return _s;
}
};
int main()
{
cout<<"start"<<endl;
A a1("a1");
cout<<"call return_A start"<<endl;
A& a2=a1.return_A("a1->a2");
cout<<"call return_A end"<<endl;
cout<<"a2._s("<<setbase(ios::hex)<<setw(sizeof(size_t)*2)<<setfill('0')
<<(size_t)a2.getString()<<") == "<<(a2.getString()?a2.getString():"nullptr")<<endl;
delete &a2;
cout<<"a2._s("<<setbase(ios::hex)<<setw(sizeof(size_t)*2)<<setfill('0')
<<(size_t)a2.getString()<<") == "<<(a2.getString()?a2.getString():"nullptr")<<endl;
cout<<"end"<<endl;
return 0;
}
/*
output:
start
constructor:a1
call return_A start
return_A start
constructor:a1->a2
return_A end
call return_A end
a2._s(17232304) == a1->a2
destructor:a1->a2
a2._s(00000000) == nullptr
end
destructor:a1
*/
因为成员函数返回的是引用,定义的a2也是引用类型,所以不会产生新的对象。