首页 | 新闻资讯 | 软件应用 | 图形图像 | 网络应用 | 硬件学堂 | 程序开发 | 安全中心 | 素材下载 | 作者专区 | 学院论坛
精选专题 | 精美壁纸 | 专家答疑 | Flash剧场 | Photoshop | 名词解释 | 梦幻桌面 | PS高手进阶 | QQ区 | 图书 | 黑客教材
Flash教程| 卡通制作 | AutoCAD | 3DMax实例 | PS视频教程| 网页制作 | CorelDRAW| Firework | 滤镜与实例 | 全部视频教程
当前位置:eNet硅谷动力 > 学院频道 > C/C++

高质量C++编程点滴
2004-06-14 22:05 作者:CSDN 来源:eNet论坛
【简 介】
你在用C++编程的时候,有没有想过提高程序质量啦?下面就来介绍一下怎么样才能提高代码的高质量.
    
加入收藏  设为首页

  一、你需要一个函数将一个数组赋值为等差数列,并将会在函数的外部使用它。  

  不合理: 

  int *GetArray( int n )
  {
   int *p = new int[n];
   for ( int i = 0; i < n; i++ )
   {
   p[i] = i;
   }
   return p;
  } 

  合理: 

  void GetArray( int *p, int n )
  {
   for ( int i = 0; i < n; i++ )
   {
   p[i] = i;
   }
  } 

  解析:  

  检查内存泄露的最好办法,就是检查完全配对的申请和释放,在函数中申请而在外部释放,将导致代码的一致性变差,难以维护。而且,你写的函数不一定是你自己使用的,这样的函数别人会不知道该怎么适当的使用,如果它是一个DLL的导出函数,并且你在不同的平台下使用了,便会导致系统崩溃。最好的解决办法就是在函数调用的外面将内存申请好,函数只对数据进行复制。  

  二、你需要写一个类来为你管理一个指针,这个类将封装对指针的申请内存、释放和其它一些基本操作。 

  不合理: 

  class A
  {
  public:
   A( void ) {}
   ~A( void ) { delete []m_pPtr; }
   void Create( int n ){ m_pPtr = new int[n]; }
  private:
   int *m_pPtr;
  }; 

  合理:  

  class A
  {
  public:
   A( void ) : m_pPtr(0){}
   ~A( void ) { Clear(); }
   bool Create( int n ){ if ( m_pPtr ) return false; m_pPtr = new int[n]; return ture; }
   void Clear( void ) { delete []m_pPtr; m_pPtr = 0; }
  private:
   int *m_pPtr;
  };

  解析:  

  不合理的代码就在于当你重复调用Create的时候就会造成内存泄露,解决的办法就是在new之前判断一下指针是否为0。要能够有效的执行这个判断,则必须在构造的时候对指针进行初始化,并为这个类添加一个Clear函数来释放内存。  
  

  三、接上题的Create函数,你现在需要根据传入的参数做一些比较复杂的算法操作,并对申请的数组赋值。  

  不合理: 

  bool Create(int *a, int n )
  {
   if ( m_pPtr )
   return false;
   m_pPtr = new int[n];
   for ( int i = 0; i < n; i++ )
   {
   m_pPtr[i] = 3 / a[i];
   }
   return true;
  }

  合理:  

  template
  class auto_array  
  {
  public:
   explicit auto_array(_Ty *pPtr=0)throw():m_Ptr(pPtr){}
   ~auto_array(){delete[]m_Ptr;}
   void reset(_Ty *pPtr=0){if(pPtr!=m_Ptr){delete[]m_Ptr;m_Ptr=pPtr;}}
   _Ty* release(void){_Ty *pTemp=m_Ptr;m_Ptr=0;return pTemp;}
  private:
   auto_array(const auto_arrayamp;other){}
   auto_arrayamp; operator=(const auto_arrayamp; other){}
   _Ty *m_Ptr;
  };
  bool A::Create(int *a, int n )
  {
   if ( m_pPtr )
   return false;
   auto_array PtrGuard( new int[n] );
   for ( int i = 0; i < n; i++ )
   {
   if ( 0 == a[i] )
   {
   return false;
   }
   PtrGuard .get()[i] = 3 / a[i];
   }
   m_pPtr = PtrGuard.release();
   return true;
  }

  解析:  

  在循环中,当参数数组a中的某一个值为0时,将会产生除0异常,那么,这将会导致你在上面为m_pPtr申请的内存不能合理的释放。为了解决这个问题,我们写了一个auto_array作为卫兵来看守企图逃逸的指针。在auto_array对象PtrGuard析构的时候它会同时删除附加在它身上的内存指针。我们首先用PtrGuard来进行所有的指针操作,在确定操作完全结束的最后,把指针再赋给真正的变量,并使PtrGuard放弃对该指针的附加,这样我们就得到了一个最安全的结果。另外需要注意的是,C++的STL库里本来有一个和auto_array功能非常相似的模版类auto_ptr,但是它只支持单个对象的内存,不支持数组,写这样一个auto_array也是不得已而为之。

   

[1] [2]下一页
关键字: C/C++ 
您对这篇文章的看法是:    喜欢 反感 支持 反对 加油 鄙视 学习 打击 佩服 漂亮 路过 发表评论
视频教程】 【专题汇总】 【不懂就问我关闭窗口

Photoshop可爱的卡通嬉儿动画教程
千里之外 在公司控制家里的BT下载
插画也时尚“恶魔以上 天使未满”
解决ARP欺骗导致小区用户无法上网
快车 FlashGet V2.4 简体中文版
相关文章
 本栏目最新文章
·初识C++
·数得明白-用C#制作源代码统计软件
·一些常用网络工具历史记录的清理
·VC++编程隐藏计算机中的鼠标
·如何编写异常安全的C++代码
 精彩回放
·3DSMAX打造书本翻开效果
·共享上网技巧应用四则
·陪酒女浸泡在酒里的青春
·美女的性感靓丽婚纱设计
·妖冶身姿 死或生3壁纸
·剿灭Win XP下的29个烦恼
·黑客必备 NET命令大全
·用PS制作精致绝伦的红酒
 精彩推荐
 今日软件下载
汇聚精彩 清晰流畅
NETiTV
网络电视王中王
 往日推荐
·手工破解网吧多种限制
·Windows 网络管理技巧
·WMP 10使用技巧三则
·女孩问你帅不帅 要小心
·注册表优化XP 20招
·制作XP万能ghost光盘
·WMP10火拼DVD播放器
·街头霸王图片集中营
·五大搜索引擎横向评测
·防御计算机病毒十大步骤

论坛精华
·PhotoShop实例精选电 
·PS初学者十三课,献给 
·photoshop完美扣图教 
·史上最强最多 photo 
·眼泪、五官、闪电、 
·网络学院flash教程目 
热点推荐
修复灰暗照片
浪漫婚纱照片
Flash视频编程
章子怡月历桌面
热点关注
·网站开发全程设计视频教程
·Photoshop CS3平面广告设计
·C++从入门到精通视频教程
·SQL Server2005视频教程
·2008年度网络电视大盘点
·计算机等级考试二级VB上机
·Pisaca照片管理软件教程
·瑞星杀毒30元轻松用全年
·瑞星卡卡上网助手 正版免费
有女如莲 Photoshop手绘古典美女
往日推荐
网站重构设计
鹏哥C#教程
美女怀旧照片
网站开发
焦点关注