当前位置: 技术问答>linux和unix
请教高手,C++返回类对象引用问题
来源: 互联网 发布时间:2016-02-27
本文导语: 下边是俺返回对象引用的源代码,不知道如何改进 clsGetNumber & clsGetNumber::Invert(void) { clsGetNumber clsGetNumber (getPower(),getValue()); clsGetNumber * NumberResultOne = new clsGetNumber (10,1);...
下边是俺返回对象引用的源代码,不知道如何改进
clsGetNumber & clsGetNumber::Invert(void)
{
clsGetNumber clsGetNumber (getPower(),getValue());
clsGetNumber * NumberResultOne = new clsGetNumber (10,1);
return * NumberResultOne;//直接返回new对象引用,没有delete,造成内存泄漏
}
有没有其他更好的返回对象的方式,如何解决该问题
clsGetNumber & clsGetNumber::Invert(void)
{
clsGetNumber clsGetNumber (getPower(),getValue());
clsGetNumber * NumberResultOne = new clsGetNumber (10,1);
return * NumberResultOne;//直接返回new对象引用,没有delete,造成内存泄漏
}
有没有其他更好的返回对象的方式,如何解决该问题
|
这种用法太容易出问题。
即使你一直记得函数内部是怎么回事,但难保证使用代码的人也都清楚。
需要外部释放的,最好直接返回指针,那样外界不会误用对象来接收。
而且函数的名字最好是:releaseXXXX,从而能够提示使用的人“偶不要了,所有权归你了,你别忘了删除哈。”
最后要说的是,最好还是从设计上做些调整,别让函数内部申请,外部释放的情况出现。
不到万不得已,不要违返“谁申请,谁释放”的原则。
即使你一直记得函数内部是怎么回事,但难保证使用代码的人也都清楚。
需要外部释放的,最好直接返回指针,那样外界不会误用对象来接收。
而且函数的名字最好是:releaseXXXX,从而能够提示使用的人“偶不要了,所有权归你了,你别忘了删除哈。”
最后要说的是,最好还是从设计上做些调整,别让函数内部申请,外部释放的情况出现。
不到万不得已,不要违返“谁申请,谁释放”的原则。
|
我觉得你的类设计上不是最好,你可以把相关的数据和方法封装起来,特别是与对象紧密相关的内存的分配与释放要封装在构造函数与析构函数里,这样可以减少类之间的依赖度。
对你的代码看的不是太明白,我的想法是,你可以加一个赋值运算符,整个代码可以是这样:
clsGetNumber a;
clsGetNumber b;
b = a.Invert();
跟内存分配的事情都在类里完成(构造函数与析构函数),=操作符做一些赋值操作。而Invert可以这样写:
clsGetNumber &clsGetNumber::Invert(void)
{
clsGetNumber NumberResultOne(10,1);
return NumberResultOne; //直接返回局部变量,不会有问题,因为我们有赋值运算符
}
对你的代码看的不是太明白,我的想法是,你可以加一个赋值运算符,整个代码可以是这样:
clsGetNumber a;
clsGetNumber b;
b = a.Invert();
跟内存分配的事情都在类里完成(构造函数与析构函数),=操作符做一些赋值操作。而Invert可以这样写:
clsGetNumber &clsGetNumber::Invert(void)
{
clsGetNumber NumberResultOne(10,1);
return NumberResultOne; //直接返回局部变量,不会有问题,因为我们有赋值运算符
}
|
这种方式返回的话,在使用的地方要返回,且声明对象时,不能new
//在使用的地方
clsGetNumber * NumberResultOne;
delete NumberResultOne;
//而不能这样,否则内存泄漏
clsGetNumber * NumberResultOne = new clsGetNumber (10,1);
delete NumberResultOne;
//在使用的地方
clsGetNumber * NumberResultOne;
delete NumberResultOne;
//而不能这样,否则内存泄漏
clsGetNumber * NumberResultOne = new clsGetNumber (10,1);
delete NumberResultOne;
|
SetNumber(clsGetNumber *NumberResultOne)
{
}
函数改为这样行不?但仍然是在外面delete
{
}
函数改为这样行不?但仍然是在外面delete