首页 | 新闻资讯 | 软件应用 | 图形图像 | 网络应用 | 硬件学堂 | 程序开发 | 安全中心 | 素材下载 | 作者专区 | 学院论坛
精选专题 | 精美壁纸 | 专家答疑 | 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++ 
您对这篇文章的看法是:    喜欢 反感 支持 反对 加油 鄙视 学习 打击 佩服 漂亮 路过 发表评论
视频教程】 【专题汇总】 【不懂就问我关闭窗口

360安全卫士 V5.1.1正式版发布!
Photoshop给模特美腿加上质感肤色
了解差距 国外27款创意名片设计赏
认清五种被忽视的黑客攻击方式
QQ音乐播放器2009正式版今天发布!
相关文章
 本栏目最新文章
·初识C++
·数得明白-用C#制作源代码统计软件
·一些常用网络工具历史记录的清理
·VC++编程隐藏计算机中的鼠标
·如何编写异常安全的C++代码
 精彩回放
·3DSMAX打造书本翻开效果
·共享上网技巧应用四则
·陪酒女浸泡在酒里的青春
·美女的性感靓丽婚纱设计
·妖冶身姿 死或生3壁纸
·剿灭Win XP下的29个烦恼
·黑客必备 NET命令大全
·用PS制作精致绝伦的红酒
 精彩推荐
 今日软件下载
杀毒软件免费随便用
瑞星全功能安全软件2009 基于“云安全”策略和“智能主动防御”技术开发.
www.rising.com.cn
 往日推荐
·推荐“美图秀秀”就能赚Q币
·五大搜索引擎横向评测
·防御计算机病毒十大步骤

论坛精华
·史上最强最多 photo 
·photoshop完美扣图教 
·网络学院flash教程目 
·Photoshop下载大全 
·PhotoShop实例精选电 
·打包笔刷 附图的~~ 
热点推荐
绘制逼真金蛋
浪漫婚纱照片
Flash视频编程
Ulead GIF教程
热点关注
·Flash CS4 制作经典小游戏
·C语言程序设计视频教程
·PHP+MYSQL开发视频教程
·Flash CS4从入门到精通教程
·服装设计与效果图绘制教程
·21视频之Fireworks8网页制作
·Vray高级实例应用视频教程
·CorelDRAW14入门到高级教程
·Vray高级实例应用视频教程
全国计算机等级考试二级(VB语言)
往日推荐
网站重构设计
鹏哥C#教程
服装设计教程
PS唯美风景
焦点关注