C++语言99个常见编程错误 常见错误67:未能采用RAII(资源获取即初始化)习惯用法

常见错误67:未能采用RAII(资源获取即初始化)习惯用法
  很多新入行的C++软件工程师都体会不到构造函数和析构函数美妙绝伦的对称性。绝大
多数此类软件工程师都活在语言为他们准备的温室中,不用为指针和(手动)内存管理操心。
安全可靠。难得糊涂。所谓编程也只不过就是精确地按照语言设计者替人们一手安排好的
路子亦步亦趋。
  可喜的是,C++语言十分重视一线的实践者,为语言的用法提供了很大的灵活性。
  RAII(资源获取即初始化)。是一种易用,扩展性强的技术,用于将资源与内存绑定,而且
高效、可预期的方式加以管理。
  构造函数和析构函数的执行序列次序完全互逆。当class对象被构造的时候,其初始化执行
次序放之四海而皆准:虚基类子对象先被构造,接下来是它们的直接基类(子对象)以其在
class定义中基类列表的出现次序依次 构造,接下来是其数据成员以其声明次序依次构造,最后
执行的是构造函数的函数体。而析构函数则实现了完全逆向的执行次序:先执行析构函数的
函数体,再是数据成员以其声明次序值逆序依次析构,再是其直接基类(子对象)以其在
class对象的构造函数都必须以相同次序执行该初始化。
  异常安全的代码很少运用try语句块。它们使用RAII习惯用法。

  标准库中的auto_ptr模板是相当有用的、为从堆上分配的对象准备的通用型资源句柄。


trace.h
#ifndef TRACE_H
#define TRACE_H

#include <iostream>

class Trace {
  public:
    Trace( const char *msg )
        : m_( msg ) { std::cout << "Entering " << m_ << std::endl; }
    ~Trace()
        { std::cout << "Exiting " << m_ << std::endl; }
  private:
    const char *m_;
};

#endif

trace.cpp
#include "trace.h"

Trace a( "global" );
 
void loopy( int cond1, int cond2 ) {
    Trace b( "function body" );
it: Trace c( "later in body" );
    if( cond1 == cond2 )
        return;
    if( cond1-1 ) {
        Trace d( "if" );
        static Trace stat( "local static" );
        while( --cond1 ) {
            Trace e( "loop" );
            if( cond1 == cond2 )
                goto it;
        }
        Trace f( "after loop" );
    }
    Trace g( "after if" );
}


main.cpp
extern void loopy( int, int );
#include<iostream>

int main() {
	loopy( 4, 2 );
	getchar();
	return 0;
}


输出
Entering global
Entering function body
Entering later in body
Entering if
Entering local static
Entering loop
Exiting loop
Entering loop
Exiting loop
Exiting if
Exiting later in body
Entering later in body
Exiting later in body
Exiting function body

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值