忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

スマートポインタ

2年・3年向けの内容です。

main()
{
 int *p=new int;
}
newで確保しただけでプログラムが終わってしまいメモリを解放していません。(メモリリーク)

main()
{
 int *p=new int;
delete p;
}
これで正しく解放されました。

deleteするのを忘れやすいし、どこかでnewしたポインタを他のプレイヤーが参照してたりして、
参照しているのに他でdeleteすると参照先が見つからなくてエラーが出て落ちたり・・
ダウンジングポインタ=ポインタの参照先が見つからねえ!(こっちはプログラム落ちます)
メモリーリーク    =解放し忘れてる!

これらの問題をあるひとつのフォーマットにしたがって書くことで、改善できます。
それが今回紹介するスマートポインタです。

拍手[0回]


main()
{
smart_ptr<int> p(new int);    // int* p=new int とほぼ同義 
}
これでリークはしません。

自分で構造体を作ってみます。
struct MyCls
{
MyCls(){puts("コンストラクタ\n")}
~MyCls(){puts("デストラクタ\n")}
};

main()
{
smart_ptr<MyCls> p(new MyCls);    // int* p=new int とほぼ同義 
}
正しく呼ばれます。


スマートポインタのクラスを超簡単に書くと、(このクラスは例なので利用できません。)
template<class Type>
class smart_ptr
{
public:
 Type* operator->(){retrun pObject}
 void operator=( Type& _obj ){ *use_cnt+=1;  pObject=_obj.pObject; use_cnt=_obj.use_cnt } // = 演算子
 ~smart_ptr(){ *use_cnt-=1; if( *use_cnt==0 ){ delete  pObject;} }    // デストラクタ
 int* use_cnt;     // 所有カウント
 Type* pObject;    // 所有先の物
}

スマートポインタには参照するポインタ所有カウンタを持っています。
スマートポインタ同士がコピーされると所有カウンタが1増えます。
逆に参照されなくなると(smart_ptrクラスのデストラクタが呼ばれると)
所有カウンタが1減ります。
1減らして 所有カウンタが0になったらポインタの解放を行います。

スマートポインタを使うとダウンジングポインタやメモリリークはなくなります。
注:参照カウンタ0の時にメンバにアクセスしようとしたらpx!=0とエラーボックスが出て落ちます。
  使いすぎはダメです。

VisualStadio2010の人はsmart_ptrクラスが標準ライブラリで実装されています
<memory>をインクルードして std::shared_ptr<Type>  のようにして使うこともできます。
boostにもあって、boost:shared_ptr<Type>のようにして書きます。

あと、私の説明よりこっちの説明が神がかっているのでこちらをオススメします。
http://www.ustream.tv/recorded/2981654
スマートポインタを知っている人でも必見です。詳しく振るまいを知ることができます!


番外編
shared_ptr<void> とデリータを設定することでガーベジコレクション的なのも作れます。
std::list<void *> m_lisなどのリストで破棄時にこのリストに登録しておいて、
いらなくなったら、解放 みたいなことができればいいのですが、deleteしても、
型情報がvoid*になっているためデストラクタが正しく呼ばれません。
デリータに以下のリストに登録するようにしておく
std::list< shared_ptr<void> > m_lis; だとclearするだけでデストラクタを呼ぶことができます。
なぜかと言うと・・・この動画を見て下さい☆

リーダ和田

PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]