当前位置:  技术问答>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,造成内存泄漏  


有没有其他更好的返回对象的方式,如何解决该问题

|
这种用法太容易出问题。
即使你一直记得函数内部是怎么回事,但难保证使用代码的人也都清楚。

需要外部释放的,最好直接返回指针,那样外界不会误用对象来接收。
而且函数的名字最好是:releaseXXXX,从而能够提示使用的人“偶不要了,所有权归你了,你别忘了删除哈。”

最后要说的是,最好还是从设计上做些调整,别让函数内部申请,外部释放的情况出现。
不到万不得已,不要违返“谁申请,谁释放”的原则。

|
我觉得你的类设计上不是最好,你可以把相关的数据和方法封装起来,特别是与对象紧密相关的内存的分配与释放要封装在构造函数与析构函数里,这样可以减少类之间的依赖度。

对你的代码看的不是太明白,我的想法是,你可以加一个赋值运算符,整个代码可以是这样:
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;

|
SetNumber(clsGetNumber *NumberResultOne)
{
}
函数改为这样行不?但仍然是在外面delete


    
 
 

您可能感兴趣的文章:

  • 请教学习c++有那些经典书籍?
  • 请教:unix或linux下的c++标准库在哪个目录??谢谢!
  • 请教: linux下用c++写最简单的socket程序如何写?
  • linux菜鸟请教:C++的学习
  • 请教:SCO OpenServer(TM) Release下能进行C++开发吗?
  • 请教个unix下c++编译器的问题
  • 请教:linux下C++与Flash怎么通讯
  • ¥¥¥¥¥请教,什么是LINUX上最好的C++集成开发环境
  • 请教一个关于C++的基础问题
  • 新手请教:请问如何将以前Windows平台下的c++工程改造到linux系统平台下
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • 请教,linux下,C/C++编程时候默认的中文编码是什么?
  • 请教Linux下多线程C++编程
  • 请教linux下C++编译环境
  • 请教一个linux c++调试问题(关于内存泄露)
  • 请教:在solaris下测试C++程序是否存在内存泄漏等问题用什么测试工具?
  • 请教几个Linux下C++问题
  • 请教关于用c编译出来的.a文件和用c++编译出来的.a文件的互用问题
  • c++程序中使用pthread编译不过,请教大家?????
  • 请教各位大虾:Red Hat Linux 9.0中编译C++程序出现:/usr/bin/ld: cannot find -lm
  • 写一个方法,向它传递一个对象,循环打印出对象层次结构中的所有类?thinking in java里面的一个习题不知道如何做请教高手?
  • 请教,如何动态创建组件对象。送分!
  • 请教:关于JSP的request对象的问题
  • 请教:为什么在<%!...%>内部定义的函数不能用jsp页面缺省的对象如:out,request,session,等。
  • 请教一个java中有关对象使用的问题
  • 请教在Servlet中如何取得JSP中提交的radio对象和checkbox的值?
  • 请教JAVA小问题:如何将含数字的String类型的对象转化为int或long类型
  • 急急急!!!请教一个关于对象数组的问题,在线等待
  • 请教如何通过sessionId得到session对象,并使之失效。
  • 请教一个对象赋值问题。
  • 请教一个在JavaScript中调用嵌入对象的方法属性的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3