[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ども・・・・・・・・・・会長の和佐田雅史です。
今日はスマートポインタについて講義します。
皆さんはnewやdeleteを知っているでしょうか?
動的に変数の領域を確保する時に
Character Chara = new Character;
とすると変数CharaにCharacter型の領域を作成する事が出来ます。
ようするにcで言うmallocを使っているとお考え下さい。
しかし、newで確保したものは解放しないとメモリリークを起こしてしまいます。
mallocで確保したメモリはfree関数で解放しないといけませんよね?
それと同じ事です。
しかし・・・・プログラマと言えど人間ですのでもしかすると解放処理を忘れてしまうかもしれません。
ですのでスマートポインタ( STLではオートポインタ )という物を使います。
std::auto_ptr< 型引数 > ptrObject;
とすると、参照がなくなった時点で勝手に解放してくれます。
javaのガーベージコレクションとまでは行きませんが便利ですよね?
ただ、中には自分でスマートポインタを作りたいという人が居るかもしれません。
なので一応簡易版をここに乗せておきます。
使いたい人はどうぞ。
※1.動的に確保したObjectのみに適用するようにして下さい
※2.ネームスペース( Wasadaとかptrとか )は自由に書き換えてもらって結構です。
使用例は
Wasada::ptr::auto_ptr< Character > Chara();
Chara->m_hp = 1;
等です。
それではお疲れ様でした。
namespace Wasada
{
namespace ptr
{
// オートポインタ定義
template< typename Type > class auto_ptr
{
private:
Type* _ptr;
friend class Type;
public:
// ptrアクセッサ
Type& operator*() const {return *_ptr;}
Type* operator->() const {return _ptr;}
// コンストラクタ
auto_ptr(const Type* ptr)
{
// this->_ptr = NULL;
this->_ptr = ptr;
}
auto_ptr()
{
this->_ptr = NULL;
this->_ptr = new Type;
}
// デストラクタで勝手に解放
virtual ~auto_ptr()
{
if( this->_ptr )
{
delete _ptr;
}
}
};
}
}
COMMENT