書籍転載
文法からはじめるプログラミング言語Microsoft Visual C++入門

C++のクラスをマスターしよう(前編)
―第10章 クラス〜オブジェクト指向プログラミング(前編)―

WINGSプロジェクト 矢吹 太朗(監修 山田 祥寛)
2010/05/19

10.1.9 リソース確保は初期化である

 ポインタをクラスのメンバにすることには、1つ大きな意義があります。次のようなコードを考えてください。

A* pA=new A();

//pを使った処理

delete pA; //オブジェクトの削除

 コードが適切で、実行時に何も問題が起こらなければよいのですが、次のように、delete文の前にreturn文があったり、処理の途中で例外(11.2節を参照)が発生したりすると、オブジェクトが適切に削除されなくなります。

A* pA=new A();

//例外の発生する可能性のある処理

//return文

delete pA; //ここに到達しない

 このような問題を避けるために、リソース(ここではnewで生成されたオブジェクト)を管理するオブジェクトを使うという方法がよく用いられます。次のコードのように、AオブジェクトのためのポインタpAをメンバに持つクラスWrapperに、Aオブジェクトの生成から削除までを任せるのです。仮に間違って処理が途中で中断しても、Wrapperオブジェクトのスコープ(この場合は関数main())の終わりには、必ず~Wrapper()が呼ばれるので、オブジェクトの削除に失敗することはありません。

#include <iostream>
using namespace std;

struct A
{
  void doSomething() { cout<<"Hello World!\n"; }
  ~A() { cout<<"Aオブジェクトは削除された\n"; }
};

struct Wrapper
{
  A* pA;
  Wrapper() : pA(new A) {}
  ~Wrapper() { delete pA; }
};

int main()
{
  Wrapper w;
  return 0; //何らかのアクシデントで処理が中断
  w.pA->doSomething();
}
[サンプル]10-raii.cp

 このような、リソースの管理にオブジェクトを使うという考え方は、「リソース確保は初期化である」(Resource Acquisition Is Initialization:RAII)という標語で呼ばれます。

 次回も引き続き、標準C++のクラスの機能を解説します。End of Article


 INDEX
  [書籍転載]文法からはじめるプログラミング言語Microsoft Visual C++入門
  C++のクラスをマスターしよう(前編)
    1.クラスとは/クラスの生成
    2.メソッド/静的メンバ/アクセス制御
    3.コンストラクタ
    4.デストラクタ/デストラクタの役割
  5.リソース確保は初期化である

インデックス・ページヘ 「文法からはじめるプログラミング言語Microsoft Visual C++入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間