書籍転載
文法からはじめるプログラミング言語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++のクラスの機能を解説します。
Insider.NET 記事ランキング
本日
月間