高质量C++编程点滴(一)

程序设计 专栏收录该内容
19 篇文章 0 订阅

高质量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_array&other){}

       auto_array& operator=(const auto_array& 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也是不得已而为之。

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
目录 前言 ................................................................................................................................... 6 第 1章文件结构 ............................................................................................................... 11 1.1 版权和版本的声明................................................................................................... 11 1.2 头文件的结构 .......................................................................................................... 12 1.3 定义文件的结构....................................................................................................... 13 1.4 头文件的作用 .......................................................................................................... 13 1.5 目录结构 .................................................................................................................. 14 第 2章程序的版式 ........................................................................................................... 15 2.1 空行.......................................................................................................................... 15 2.2 代码行...................................................................................................................... 16 2.3 代码行内的空格....................................................................................................... 17 2.4 对齐.......................................................................................................................... 18 2.5 长行拆分 .................................................................................................................. 19 2.6 修饰符的位置 .......................................................................................................... 19 2.7 注释.......................................................................................................................... 20 2.8 类的版式 .................................................................................................................. 21 第 3章命名规则 ............................................................................................................... 22 3.1 共性规则 .................................................................................................................. 22 3.2 简单的 WINDOWS应用程序命名规则 ...................................................................... 23 3.3 简单的 UNIX应用程序命名规则.............................................................................. 25 第 4章表达式和基本语句................................................................................................ 26 4.1 运算符的优先级....................................................................................................... 26 4.2 复合表达式 .............................................................................................................. 27 4.3 IF 语句 ...................................................................................................................... 27 4.4 循环语句的效率....................................................................................................... 29 4.5 FOR语句的循环控制变量 ........................................................................................ 30 4.6 SWITCH语句 .............................................................................................................. 30 4.7 GOTO语句 ................................................................................................................. 31 第 5章常量....................................................................................................................... 33 5.1 为什么需要常量....................................................................................................... 33 5.2 CONST与 #DEFINE的比较 ........................................................................................ 33 5.3 常量定义规则 .......................................................................................................... 33 5.4 类中的常量 .............................................................................................................. 34 第 6章函数设计 ............................................................................................................... 36 2001 Page 3 of 101 化境编程界推荐图书系列 -高质量 C++/C 编程指南,v 1.0 6.1 参数的规则 .............................................................................................................. 36 6.2 返回值的规则 .......................................................................................................... 37 6.3 函数内部实现的规则 ............................................................................................... 39 6.4 其它建议 .................................................................................................................. 40 6.5 使用断言 .................................................................................................................. 41 6.6 引用与指针的比较 ................................................................................................... 42 第 7章内存管理 ............................................................................................................... 44 7.1内存分配方式 ........................................................................................................... 44 7.2常见的内存错误及其对策 ........................................................................................ 44 7.3指针与数组的对比 .................................................................................................... 45 7.4指针参数是如何传递内存的? ................................................................................. 47 7.5 FREE和 DELETE把指针怎么啦? .............................................................................. 50 7.6 动态内存会被自动释放吗? .................................................................................... 50 7.7 杜绝“野指针” ....................................................................................................... 51 7.8 有了 MALLOC/FREE为什么还要 NEW/DELETE ? ..................................................... 52 7.9 内存耗尽怎么办? ................................................................................................... 53 7.10 MALLOC/FREE的使用要点 ...................................................................................... 54 7.11 NEW/DELETE的使用要点 ........................................................................................ 55 7.12 些心得体会 ......................................................................................................... 56 第 8章 C++函数的高级特性 ............................................................................................ 57 8.1 函数重载的概念 ....................................................................................................... 57 8.2 成员函数的重载、覆盖与隐藏 ................................................................................ 60 8.3 参数的缺省值 .......................................................................................................... 63 8.4 运算符重载 .............................................................................................................. 64 8.5 函数内联 .................................................................................................................. 65 8.6 些心得体会 .......................................................................................................... 68 第 9章类的构造函数、析构函数与赋值函数 ................................................................. 69 9.1 构造函数与析构函数的起源 .................................................................................... 69 9.2 构造函数的初始化表 ............................................................................................... 70 9.3 构造和析构的次序 ................................................................................................... 72 9.4 示例:类 STRING的构造函数与析构函数 ............................................................... 72 9.5 不要轻视拷贝构造函数与赋值函数 ........................................................................ 73 9.6 示例:类 STRING的拷贝构造函数与赋值函数 ....................................................... 73 9.7 偷懒的办法处理拷贝构造函数与赋值函数 ............................................................. 75 9.8 如何在派生类中实现类的基本函数 ........................................................................ 75 9.9些心得体会 ........................................................................................................... 77 第 10章类的继承与组合 .................................................................................................. 78 2001 Page 4 of 101 化境编程界推荐图书系列 -高质量 C++/C 编程指南,v 1.0 10.1 继承........................................................................................................................ 78 10.2 组合........................................................................................................................ 80 第 11章其它编程经验 ...................................................................................................... 82 11.1使用 CONST提高函数的健壮性 .............................................................................. 82 11.2提高程序的效率 ..................................................................................................... 84 11.3些有益的建议 ..................................................................................................... 85 参考文献 ............................................................................................................................ 87 附录 A :C++/C代码审查表 ............................................................................................ 88 附录 B :C++/C试题 ....................................................................................................... 93 附录 C :C++/C试题的答案与评分标准 ......................................................................... 97
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值