ゲームプログラマ志望が福岡で叫ぶ 『絶望』 -8ページ目

ゲームプログラマ志望が福岡で叫ぶ 『絶望』

プログラマーになりたい!!!!! あ、風のうわさで聞いた最近若者で流行っているトゥイッターなるものを始めてみました (・ト・) @toshi_desu_yo

今、お勉強中。




 Mac で 

************************

Webサーバー ( Apatche ?なるもの )
PHP
MySQL を 使用して色々やってます。


************************





というか、まず。



設定が超めんどくさかった( ゚д゚ )

これは糞が10個前に付くぐらい。





アパッチさん・・・(´;ω;`)

後 MySQL がめんどくさくてめんどくさくて・・・




厄介なのは日本語対応をしてなくて、




データベースに日本語を格納できない ↓


『なんでやぁ~~~!!!!なんでやぁ~なんd・・』




っと夕日に向かって叫ぶ時間が半端無かったことですね。




今は Javascript と PHP と MySQL を使って データベースにデータを格納して



①Javascript で PHP にアクセス ↓
②PHPからMySQL にアクセス ↓
③PHPがデータベースからデータを貰う ↓
④PHPがJavascript に返す ↓
⑤Javascriptがブラウザにデータを表示する(`・ω・´)




という簡単なことから始めています。


出来ればサーバーも作ってみて対戦ゲームとか作ってみたいな・・・ と自分の力量を甘く見つつ妄想してます。







~~~~~~~~~~ 二日後 ~~~~~~~~~~~~~~~~



やっと・・・
HTMLからMySQLにアクセスできた・・・(ヽ´ω`)







一覧表示を押すと・・・



ローカルホストの中にある

売上データベースに予め格納してある情報を表示する。



MySQL、アパッチ、HTML、PHPの使い方は以下のサイト様を主に参考にさせて頂きましたm(_ _)m
ありがとうございます。 

シンプルな作りで、項目別に知りたいことが調べられてすごく便利です!

【 (URL) MySQLの使い方 : TATSUO IKURA 様


僕はMacなのでほかのサイト様も転々と拝見さて頂きましたが。。




初めてWebプログラム経験しましたが( これをWebプログラムって呼ぶのかは知らない )って何が難しいって・・・


デバッグ( ´)Д(`)




どこでバグが出ているのかがわからない・・・


結果を実行してなにも出てない場合


・URL先にちゃんと飛んでいるのか?( 今回だとローカルなサーバー内のPHP )
・PHPからMySQLにちゃんとアクセスできていない。
・MySQLにアクセスは出来ているが返り値がおかしい。
・返り値は出来ているが表示がおかしい。
・そもそも全てダメ。




上記のどこをミスっているのかが分からない( ゚д゚ )



参考書も読まず、適当に作り上げたのでデバッグ部分のプログラムを書いていない。

みなさんはどうやってデバッグしているのか・・・ 凄い気になります。


やっぱり途中に 成否 を表示するプログラムを書くべきなのか・・・


もしかしたら HTML用のエディタがあるのかも。
( 調べずにずっとテキストエディタで書いてます。 めんどくs・・・ )

というかあると思う。



デバッグがしにくいよおおおおおおおおおおお!!!!!!!!!!!。・゚・(ノД`)・゚・。



ココらへんが VC 上で開発するのと違って好きになれないところです。




後、コレが出来たので次は



JavaScript と HTML を使い、簡単なゲームを作成 ↓

データベースにランキングを保持するプログラムを作成してます!(`・ω・´)


こういうのが出来ないと何のためのWebサーバーとMySQLか実感できない。。


でも ポート開放とか怖いことしていないのでローカル上限定だけどね!!


サーバー構築もやってみたいなぁ。。 ( 願望 )




~~~~~~~~~~ 一日後 ~~~~~~~~~~~~~~~~



折角なのでぷよぷっぽいのを作って見ることにしました。


JavaScript 単純だと思ってたけど奥がふけぇ・・・ なんだこれはおちょこより深いわ・・・





HTML の Canvas で手探りながらも作成してます~


現在こんな感じ ↓







色が気持ち悪っ・・・( ^ω^)



一応ウィンドウサイズが変化したらそれによってブロックのサイズも変えるようにしてます。

これが難しかった。




ウィンドウサイズが変わった時に指定した関数を呼び出すイベント。

window.onresize = ReSize;



onewsizeさん。


javascript上で document.write() をやるとキャンセルされるんですね・・・


『なんで最初の一回しか ReSize されないんだよおおおお!!』

半日迷いましたよ・・・(ヽ´ω`)




まぁリファレンスを読んでない僕が悪いんですけどね。


まどろっこしいのも嫌いなんで、変数と配列と関数とオブジェクトの書き方だけ読んで後は適当に開発してます。



はい、またデバッグがくっっそきついです(成長してない)



んーーーーーー

まだ簡単なプログラムだからいいけどどうしたもんかなぁ




取り敢えずぷよぷよで遊べるまでがんばる(`・ω・´)


といいつつ、今現在 VisualStdio で C++ を触っているのはシークレットです。





【結論】

ぷよぷよはぷよぷよ通が好きで、アルルとドラコとノミが好きです。




ケイン・コスギのようなスマートなポインタ。


スマートポインタの第二幕です(`・ω・´)


なぜケイン・コスギかというと、僕の中で一番好きなコスギが ケイン・コスギ だからです。
『べつにケイン・コスギはスマートじゃない』っていうのは受け付けません。




取り敢えず 前回のスマートポインタ に付け加えたい、無くてはならない機能としては,,,,


 
************************************

・スマートポインタ間のコピー
・アップキャストの対応

************************************



が最低限でしょうか。



スマートポインタ間のコピーは、



SmartPtr< MyClass > spMyClassA( new MyClass );
SmartPtr< MyClass > spMyClassB;

spMyClassB = spMyClassA;




================================================
保持しているポインタの受け渡しと参照カウンタの共有化をさせる。
================================================

ということです。



これは Operator 機能使えば出来そうです。




********【 Operator 】*********


クラスに

void opeartor = ( /* 引数 */ )
{
}



と書けば  『= 関数を作成した』みたいな感じです。

だから関数の中身に自分で好きな記述をすることができます。



使い方としては


class Object
{
public:
    void operator = ( Object* pObj )
    {
        printf( "= 関数が呼ばれたよ。" );
    }

};

~~~~~~~~~~~

Object* pObjectA = new Object;
Object* pObjectB = new Object;

pObjectB = pObjectA;


----【出力】----

"= 関数が呼ばれたよ。"





という感じで、 = の右側に書いた物が引数となります。

べつに Object型のポインタを引数に取らなくても...



class Object
{
public:
    void operator = ( int value )
    {
        printf( "数字は %d です¥n", &value );
    }

};

~~~~~~~~~~~

Object* pObjectA = new Object;

pObjectA = 1;
pObjectA = 3;


----【出力】----

"数字は 1 です"
"数字は 3 です"






と、引数はなんでもいいです。


取り敢えず ”演算子を継承する” と僕は覚えてます。



コレは "==", "+", "-", "->", "/", "*". "<<" など

c++ にある演算子は全部継承できます。



****************************






スマートポインタ間のコピーが出来るように operator = をスマートポインタクラスに記述...



template< class T >
class SmartPtr
{
protected:

/* 内包されるポインタ */
T* mPtr;

/* 参照カウント */
unsigned int* mpCount;

public:

explicit SmartPtr( T* ptr = NULL )
: mPtr( ptr ), mpCount( NULL )
{
if ( mPtr )
{
mpCount = new unsigned int( 1 );
}
}
explicit SmartPtr( SmartPtr< T >& sp )
{
mPtr = sp.mPtr;
mpCount = sp.mpCount;
( *mpCount )++;
}
~SmartPtr()
{
Release();
}


/**
* 内包してあるポインタを渡す
*/
T* GetPtr() const { return mPtr; }


/**
* [ Operator = ]
* スマートポインタ間のコピー
*/
SmartPtr< T >& operator = ( const SmartPtr< T >& sp )
{
//** 同じポインタは代入しない
if ( mPtr != sp.GetPtr() )
{
//** 元々の参照カウンタを減少
Release();

//** 入れ替え
mpCount = sp.mpCount;
mPtr = sp.mPtr;

if ( mpCount != NULL )
++*mpCount;
}

return *this;
}






protected:
void Release()
{
//** 参照カウンタが0になったらdeleteを行う。
if ( mPtr && --*mpCount == 0 )
{
delete mPtr;
delete mpCount;

mPtr = NULL;
mpCount = NULL;
}
}
};



すでに 自分が ポインタを保持している可能性が あるので、まず Release をすることが必須です。

それから入れ替えます。


そして、ポインタを共有する人数が増えたので参照カウンタを増加。。。



こんなかんじで実行。




良い感じ・・・


便利に使いやすくするように operator -> operator * も記述。。。




template< class T >
class SmartPtr
{
protected:

/* 内包されるポインタ */
T* mPtr;

/* 参照カウント */
unsigned int* mpCount;

public:

explicit SmartPtr( T* ptr = NULL )
: mPtr( ptr ), mpCount( NULL )
{
if ( mPtr )
{
mpCount = new unsigned int( 1 );
}
}
explicit SmartPtr( SmartPtr< T >& sp )
{
mPtr = sp.mPtr;
mpCount = sp.mpCount;
( *mpCount )++;
}
~SmartPtr()
{
Release();
}


/**
* 内包してあるポインタを渡す
*/
T* GetPtr() const { return mPtr; }
T* operator -> () const { return GetPtr(); }
T& operator * () const { return *GetPtr(); }


/**
* [ Operator = ]
* スマートポインタ間のコピー
*/
SmartPtr< T >& operator = ( const SmartPtr< T >& sp )
{
//** 同じポインタは代入しない
if ( mPtr != sp.GetPtr() )
{
//** 元々の参照カウンタを減少
Release();

//** 入れ替え
mpCount = sp.mpCount;
mPtr = sp.mPtr;

if ( mpCount != NULL )
++*mpCount;
}

return *this;
}






protected:
void Release()
{
//** 参照カウンタが0になったらdeleteを行う。
if ( mPtr && --*mpCount == 0 )
{
delete mPtr;
delete mpCount;

mPtr = NULL;
mpCount = NULL;
}
}
};




-> *

保持してあるポインタにアクセスできるようになりました!(`・ω・´)



これで使いやすさ UP  ↑





*************************


次に 【 アップキャスト 】




class A
{};

class B : public A
{};


~~~~~~~~~~~~~


SmartPtr< A > A( new B );



SmartPtr< A > A;
SmartPtr< B > B( new B );

A = B;





実現したい。



先ほどのスマートポインタクラスではエラーとなる
ので

新たな コピーコンストラクタ と operator を作成。





template< class T >

class SmartPtr

{

protected:


/* 内包されるポインタ */

T* mPtr;


/* 参照カウント */

unsigned int* mpCount;


public:


explicit SmartPtr( T* ptr = NULL )

: mPtr( ptr ), mpCount( NULL )

{

if ( mPtr )

{

mpCount = new unsigned int( 1 );

}

}

explicit SmartPtr( SmartPtr< T >& sp )

{

mPtr = sp.mPtr;

mpCount = sp.mpCount;

( *mpCount )++;

}

/**

* アップキャスト対応させるコンストラクタ

*/

template< class T2 >

SmartPtr( const SmartPtr< T2 >& sp )

{

mPtr = sp.GetPtr();

mpCount = sp.GetCounter();

++*mpCount;

}

~SmartPtr()

{

Release();

}



/**

* 内包してあるポインタを渡す

*/

T* GetPtr() const { return mPtr; }

T* operator -> () const { return GetPtr(); }

T& operator * () const { return *GetPtr(); }

// 参照カウンタ

unsigned int* GetCounter() const { return mpCount; }



/**

* [ Operator = ]

* スマートポインタ間のコピー

*/

SmartPtr< T >& operator = ( const SmartPtr< T >& sp )

{

if ( mPtr != sp.GetPtr() )

{

Release();


mpCount = sp.mpCount;

mPtr = sp.mPtr;


if ( mpCount != NULL )

++*mpCount;

}


return *this;

}

// アップキャスト対応

template< class T2 >

SmartPtr< T >& operator = ( const SmartPtr< T2 >& sp )

{

if ( mPtr != sp.GetPtr() )

{

Release();


mpCount = sp.GetCounter();

mPtr = sp.GetPtr();


if ( mpCount != NULL )

++*mpCount;

}


return *this;

}







protected:

void Release()

{

//** 参照カウンタが0になったらdeleteを行う。

if ( mPtr && --*mpCount == 0 )

{

delete mPtr;

delete mpCount;


mPtr = NULL;

mpCount = NULL;

}

}

};








template< class T2 >

SmartPtr( const SmartPtr< T2 >& sp )


template< class T2 >

SmartPtr< T >& operator = ( const SmartPtr< T2 >& sp )




これが、アップキャストに対応させたコピーコンストラクタ operator = です。



template はビルド通した時に 


『おい! この記述は出来ねーぞks!!!』

罵倒してくれるので、





キャストがうまくいかない書き方をしていた場合、
実行前にエラーを出してくれます。



すごい・・・便利です・・・///




使ってみた ↓


【 コピーコンストラクタ 】



【 operator = 】




うまくビルドも通ってメモリリークも発生していません!
(゚∀゚≡(゚∀゚≡゚∀゚)≡゚∀゚)



コレを元に自分で機能を追加していってみるといいんじゃないかと思います。




いじょu!


****************************************
【 (URL) スマートポインタ02
****************************************







『iPhone開発の XCode とかは自力でメモリ管理してくれてるからいいなぁ・・・』

と思ってたりもするけどメモリ関係は自分で管理してないと不安で仕方がないと感じる自分もいるので iPhone開発中、実はXCodeのメモリ管理を切ってたりします。


というか、
ちょっと前にやっとObjective-Cをそこそこ使えるようになって、Objective-Cのみでゲーム作ったりした。

それまで C++ で書いてました。


Objective-C 使いやすいとは思うけど独特のメモリ管理がムズムズする。

あと 実機ではOpenGL ES で使えない機能があったりしてめっちゃ困る。


前モデルを3Dで出すアプリ作ってた時、テクスチャに行列書き込みが出来なかった・・

あと、シュミレーターではアンチエイリアス効く所が実機では効かなかった・・・



あ、愚痴になってきたのでココらへんで去ります



そう言えば、 2月のイベント。

ヴァレンタインがありましたね( ゚д゚ )



性ントクリスマスと並ぶ二大祭。

憎悪と怒りをメルトダウンさせるいいイベントですね^^



毎年毎年枕を濡らす一日をおくっていた僕...

ニトリの低反発まくらも安くはないのです。




しかぁああああああし!!!


今年はあぁああああああああああ!!!






貰っているのさm9( ゚д゚)

これぞ THE・社会人クオリティ





しかし、


証 拠 写 真 紛 失(´;ω;`)


いや、本当に貰ったんですよ。マジで。割とガチでマジでマジでガチで。



一応一枚はあった。 ↓



これは会社からいただだだきましたチョコです-!


ラリックマが可愛いですねー!!! 

しかし食べにくいので未だに家で飾ってあります( ̄- ̄) 



後2つ・・・ 後、2人の方から頂いたのですが・・・ 画像なし。



いや、貰ったんですのよマジで。ガチでマジでマジでガチで。




しかし、昔は

『ヴァレンタインとかロッテの陰謀だろ。あんなクソみたいな勝ち組と負け組を公に露呈するイベントを行なって何が楽しいんだ。まぁ俺はどうせ負け組だからチョコなんて貰わないし。は?てか、いらねーし。チョコとか砂糖の塊だろ。脂肪に変わるだけの食べ物をなぜ貰わないといけないんですかねぇ?むしろこっちからお断りだわ。 ヴァレンタインでチョコを貰うやつ。そのチョコレートが貴様を関取の道に進ませる第一歩なんだよ。30過ぎた時にお腹まわりを見て絶望と憎悪に打ちひしがれるが良い。俺はあの時チョコを食べなかったからケイン・コスギ スタイルを確立出来てる。はははははははっはh・・・』


略すと  『嫉妬してたわ。』



現在が勝てないからって未来に賭けてたわー。

実際は未来でも勝てそうにないわー。




しかし!

我輩の不屈の精神と日々のたゆまぬ努力で見事今年はGET出来ました。


正直。。。。 素直にうれしい・・・( ゚д゚ )↑



はい! ただの自慢話でした!!!




****************************


バレンタインって世界だと男女共に手紙やクッキーを好きな人に送る行事らしいですぞ。

そっちの方がいいですね。




日本はお菓子メーカーの策略でチョコレート





【2/14】
女性 → 男性にチョコ( 300円 )

【3/14】
男性 → 女性にバッグ( 3万円 )


割に合わねぇ-ぞ!!!ドンッ!


なのでお返しとしては夕ご飯をごちそうしてあげる感じでいいんじゃないかと思います。
というかそうする予定です。( お金がない )


でも、大半の男性はチョコレートなんて普段全くといいほど口に入れないので実は結構ありがてぇと思ったりする。

僕は金銭的にチョコレートを買う余裕が無い。


チョコレートは普通に好きですし食料確保できてありがたいです。




以上!

結論 : カロリー



久々のプログラミング。

お仕事に追われる日々から開放されてちょっと日常が楽しくなってきた(^^ゞ



=============================================


テンプレートの練習もかねて スマートで利口なポインタ


 スマートポインタをやっていきます(`・ω・´)




C++ でプログラムをしていると必ず立ちはだかるメモリリーク。


(例) ↓



まどかさんがまさか現実に存在しないなんて・・・






_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );



を書くことで

プログラム終了時メモリリークがあれば出力画面に出してくれます。
すごく便利


↑の画像では 1Byte のメモリリークが発生していることがわかります。



まぁこれは見てわかるように、

オブジェクトをnewで生成したのに条件によっては
  delete せずにプログラムを終了させています。



そらメモリリークです。




『実際ありえないε- (´ー`*)』


と思われますが、、、、、、、、ありえます( ゚д゚ )
むしろありありです。



こういうミスを無くすためにスマートポインタはあります。



【スマートポインタ】

 :自動的にdeleteを行い、メモリリークを発生させないようにする機構。



使い方としては、


SmartPtr< GodClass > spGod( new Ore );


↑ みたく、スマートポインタに削除依頼をするオブジェクトのポインタを渡します。



あとは、spGodが 誰からも参照されなくなった
スマートポインタが自動的に内部のオブジェクトを delete してくれます。

※ 要するに世界の誰からも相手され無くなったら寂しさの余り自分で自分をころすんですね。
^^ まるで・・・ いや、なんでもないです。






べつにスマートポインタを書かなくても

***************************************************************************
○ new を書いたら delete を忘れずに書く。

***************************************************************************



その約束事を自分の中に確実な決め事としておくと、
スマートポインタなぞいらないかもしれません。



だけどそんな契約書も無ければ罰則もない約束事など締め切り前になると

スッポオオーーーン!! と地平線の彼方に飛んでいきます。




早く完成させないと..! 早く完成させないと..!! 早く完成させないと..!!!!
ガタガタガタガタタガタブrブrブrブrブルbルbルbr



この状態になると new を書いたところで delete の事なぞ覚えているはずがありません。



仮にまだ精神が正常だったとして delete を書く癖が残っていても
  必ずどこかでメモリリークは出ます。 

必ずです。。。。。。(慟哭)




僕も最初は  

『スマートポインタなんて記述がめんどくさいしコード汚くなるし、メモリリーク出たらその時に考えるから別にいらねーよks』



 スマートポインタさんを罵倒していた時期がありました。







結果、痛い目見ました('Д')


『new だけを自分が行い、Deleteを自動的にやってくれる機能があればどれだけうれしいか・・・』

そうプロジェクト開発末期、バグ取りが終わった幻想を見かけた時に思いました。



なのでメンドクサイだろうけどスマートポインタは使っていきましょう!

delete が無いだけでとてもプログラムが気持ちよくなります。




*******************************



ポインタとなるクラスの型は様々です。



MyClass。 PantsuClass。 EroClass。。。。。 etc...


それぞれの型に合わせたスマートポインタクラスを作ろう!

と考えた場合、、 



くssssssssssssssssっそメンドクサイです。



【個別でスマートポインタクラスを作成】

class MyClassSmartPtr
{
    MyClass* mPtr;
...

    MyClassSmartPtr( MyClass* ptr )
        : mPtr( ptr )
    {}
    ~MyClassSmartPtr()
    {
        delete mPtr;
    }
};

class PantsuClassSmartPtr
{
    PantsuClass* mPtr;
...

    PantsuClassSmartPtr( PantsuClass* ptr )
        : mPtr( ptr )
    {}  
    ~
 PantsuClassSmartPtr()
    {
        delete mPtr;
    }
};

class EroCLassSmartPtr
{
    EroClass* mPtr;
...

    EroCLassSmartPtr( EroClass* ptr )
        : mPtr( ptr )
    {}
    
~ EroCLassSmartPtr()
    {
        delete mPtr;
    }

};




↑ デストラクタ時に保持してるポインタを削除。





なので、自由に型を決めることができる テンプレート を使用します。



【型にとらわれないスマートポインタクラス】

template< class T >
class SmartPtr
{
    T* mPtr;
...

    SmartPtr( T* ptr )
        : mPtr( ptr )
    {}
};



こうすることで型という縄( 亀甲 )に縛られない
スマートポインタクラスを作ることができます


テンプレート は最初わけわかめだったですが、使っていくと超便利・・・



SmartPtr< MyClass >     spMyClass( new MyClass );
SmartPtr< PantsuClass> spPantsuClass( new PantsuClass );
SmartPtr< EroClass >     spEroClass( new EroClass );



こんな感じに書いて、あとは放置プレイでOKです。
勝手にdelete をしてくれます。。。。。。。。      


  というクラスを作っていきます!




世の中に出回っているスマートポインタの大半は参照カウンタを内部に持つ

参照カウンタ方式を採用しているのではないかと思います。



SmartPtrクラスの内部に unsigned int 型の変数を一つ持ち、



SmartPtr< MyClass >     spMyClass( new MyClass );

生成が行われると 1 になり、


ほかのスマートポインタにコピーされる  ↓


spMyClass2 = spMyClass;


など、内部のポインタが別のスマートポインタとの共有になるたび、
カウンタが 1 増やされ



スマートポインタが消える時、つまりデストラクタが呼ばれると 1 減らされます。


減らされたときに
  カウンタが 0 になれば、内包してあるポインタを delete する。



こんな感じです。



スマートポインタ間のコピーのことはあとで考える(・・・)として、

とりあえずクラスとしてはこんな感じになるんじゃないでしょうか。



template< class T >
class SmartPtr
{
protected:

    /* 内包されるポインタ */
    T* mPtr;

    /* 参照カウント */
    unsigned int mCount;

public:
    

    /**
      * デフォルトコンストラクタ
      */
    SmartPtr( T* ptr )
        : mPtr( ptr ), mpCount( 0 )
    {
        if ( mPtr )
        {
            mpCount = 1;
        }
    }

    /**
      * デストラクタ
      */
    ~SmartPtr()
    {
        if ( mPtr && --mpCount == 0 )
        {
            delete mPtr;
            mPtr = NULL;
        }
    }

};



実際に使って確認してみる。


int main( void )
{
    //** 自動メモリリークチェッカー

    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


    SmartPtr< MyClass > spMyClass( new MyClass );

 

    return 0;
}




SmartPtr を MyClass 型のスマートポインタにして MyClass のポインタを保持させる。



終了時にデストラクタが呼ばれて、参照カウンタが0。 なのでdeleteされて、、、


結果、無事メモリリークは起きていません!(`・ω・´)




これを元にスマートポインタクラスを創りあげていけばいいんじゃないかと!

取り敢えずこんなしょぼいスマートポインタ。


・コピー未対応。



使い物にならない・・・




関数の引数や変数間でコピーなんてぬるぬると存在します。

せめてコピーぐらいしとかないといけない。。。



まずコピーするにあたって、 ↑のソースだと


コピーしたスマートポインタ先で参照カウンタが増加、減少してもコピー元のスマートポインタの参照カウンタは影響を受けません。




これだと元のスマートポインタのデストラクタが呼ばれた時点で参照カウンタが0になり、
まだ他のスマートポインタクラスが 0x1234abc 参照しているにもかかわらず delete されます。



ダングリングポインタ( 不正なポインタを指す状態 )になってしまいます。




なので、
参照カウンタもポインタにします。


これだと、



コピーをいたる所で行い参照カウンタが増加、減少してもスマートポインタの参照カウンタも共有しているので、


全ての共有したスマートポインタが使われなくなった時( つまり参照カウンタが0 )に初めてdeleteを行なってくれます。




これならばスマートポインタ同士のコピーにも対応できそうです。


取り敢えず コピーコンストラクタを実装した現時点でのスマートポインタ ↓






template< class T >
class SmartPtr
{
protected:

/* 内包されるポインタ */
T* mPtr;

/* 参照カウント */
unsigned int* mpCount;

public:

/**
* デフォルトコンストラクタ
*/
explicit SmartPtr( T* ptr = NULL )
: mPtr( ptr ), mpCount( NULL )
{
if ( mPtr )
{
mpCount = new unsigned int;
mpCount = 1;
}
}
/**
* コピーコンストラクタ
* この時、まだポインタは保持していないのでReleaseは行わない。
*/
explicit SmartPtr( SmartPtr< T >& sp )
{
mPtr = sp.mPtr;
mpCount = sp.mpCount;

( *mpCount )++;
}


/**
* デストラクタ
*/
~SmartPtr()
{
Release();
}



protected:
/**
* 参照カウンタを 1 減少させる
*/
void Release()
{
if ( mPtr && --*mpCount == 0 )
{
delete mPtr;
delete mpCount;

mPtr = NULL;
mpCount = NULL;
}
}
};



これを使ってみた。


出力画面にスマートポインタの流れを記述。





ちゃんとメモリリークは起きていない。
explicitは今は取り敢えず まぁつけといたら助かるわ。ぐらいで。。。


****************************

① spMyClassAでMyClassのポインタを保持させた時に参照カウンタが 1 になる。
② spMyClassBのコピーコンストラクタでspMyClassAを渡すことで参照カウンタが 2 になる。
③ main関数が終了。
③ spMyClassBのデストラクタが呼ばれて参照カウンタが 1 になる。
④ spMyClassAのデストラクタが呼ばれて参照カウンタが 0 になり delete される。

****************************




後は 

spMyClassB = spMyClassA; 

というコピーもやりたいのでどんどん組み込んでいこうと思います!


取り敢えず以上です!はい!



スマートポインタ は ほんとうに つかうように しま しょ う・・・(´;ω;`)




************************
【 (URL) スマートポインタ01
************************

皆さんお久しぶりです(`・ω・´)

最近お仕事ばかりで全くブログを更新できていないのでたまにはしたいとおもーます。


前回の三連休は特に何もしてないのですが、
絶対就職したくない企業で有名のワタミさんにおじゃましましてお酒をのみました。








なぜ日本酒かというと安くて量があり、中々に酔う飲み物だからです!
ニホンシュサイコー!!!(n‘∀‘)η


ワタミは普通に美味しいですけど
焼き鳥系が余りありませんね。だから普段は違う所に行きますけど。





軟骨の唐揚げがいいですね! 

コリコリとした食感に食べやすいサイズ。。。
 



鶏の唐揚げだとデカくてキツイ時でも軟骨ならば軽くつまみながらお酒を飲めるので中々に優秀な骨ですよ。奴は。


コリコリコリコリコリコリ( ゚Д゚)


大きさといいコリコリさといい、まるでクリt・・・




・・・・( ゚д゚ )



そしてまたイオンモールに行って来ました。

イオンモール優秀。



困ったときはイオンモール。 

デートでお金がないときは取り敢えずイオンモールに行ってぶらぶらしたら
単純な相手だと簡単に騙されますゼェ・・・


デートしませんけど。




あ、DVD借りてプロメテウス見ました!(`・ω・´)

エイリアンが好きな僕。


口から出る シャー!! って部分が何故か好きです。




友だちから聞きましたが

エイリアンとプレデターの世界ってつながってるんですね!!

本当かどうかはわかりませんが。


なんか


======================================================

プレデター 1, 2 →
   エイリアンVSプレデター 1, 2 →
      エイリアン1, 2, 3, 4

======================================================


の時系列らしく、プレデターの技術を人間がパクったことで、

人間が宇宙船を作ることが出来た。 ということらしいです。



で、プロメテウスエイリアン VS プレデター の後でエイリアンの前の話だということ。


・・・らしい。 ( 真相はわかりません )





でも中々に面白い話だと思います!

だとするとシュワちゃん( プレデター 1 ) はエイリアンと同じ世界にいたということ・・・




エイリアンとかプレデターとか SF 系が大好物な僕。

なんか 『化け物ー!(*´д`*)イヤァ-ン!! 』 って感じの映画が好きです。



ゾンビ系とかロボット系とか。

日常ではありえないことを描く奴がいいですね。


妄想が膨らみますわ! 見終わった後にドキドキしながら回想するのが好き。



だから俗にいうB級映画大好物。

次はピラニアと言う映画が見てみたいです(`・ω・´)



映画が好きな女子はいいですよね。

取り敢えず映画に連れて行けばおk。



そしてDVDを借りて家で部屋を暗くして見る。 



するとあら不思議。 映画を見ていたはずが聖なる夜に早変わりです。



 家でDVD見よう!  =  襲ってok。 ってことでしょう。



まぁまず女性が家に来るって前提条件が限りなく無に等しいわけですが・・・(´;ω;`)





長くなるとまた更新しなくなるのでこのへんにしとこう。


そう言えばロシアで隕石が降って来ましたね!!



しかも映画のCGみたいにあんな綺麗に飛んでくるとは・・・

本当にエイリアンとかトランスフォーマーとかが来たのかと思ったわ。。。





ロシア・・・


おそロシアァアアアァアァアアアアアアァアアアアアアァアアアアアアァアアアアアアアアアア!!!!!!!!!!!


って後輩に言ったら 『ツイッターでそれみんな言ってましたよw』 って言われてちょっと落ち込んだ