////////////////////////////////////////////////////////////////////
◎ ≪----＝ 業務用小型ダーツマシン「ダーツイーグル」

お客さまの少ない、ちょっとした空き時間にダーツタイムを。
壁掛け型で省スペース。これならどんな場所でも設置できます。

『大阪ギフトショー新製品コンテスト大賞受賞！』
http://af1.mag2.com/m/af/0000008658/001/s00000001980002/011

＝~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~＝----≫◎
////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2006 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2006/11/20(Mon) No.383
    配信数： 1681
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// NEW!!
http://www.kab-studio.biz/index.html

2006/11/20 (Mon)
　ほとはー外伝３にP.80を追加！
[ 三人合体ホットハーブ 外伝３ 【ワタシ の キロク】 ]
http://www.kab-studio.biz/Comic/HotHerbA3/index.html

2006/11/20 (Mon)
　#pragma twice ホームページ版にアーカイブ追加！
17.14 多態性、多相性
17.15 ポリモーフィズムの意味
[ #pragma twice ]
http://www.kab-studio.biz/Programing/PragmaTwice/index.html


////////////////////////////////////////////////////////////////////
// ちょお普通な日記
http://www.kab-studio.biz/nikki2/index.html

2006/11/12 (Sun)
　１０時半起き。少しずつずれる。午後までウイイレDS。定期更新とアニメ
の感想書きとアジアシリーズ。ほとはー外伝３描きも。

2006/11/13 (Mon)
　１０時過ぎ起き。寒い。明日のためにホームページの修正。洗濯して
うたわれしてウイイレDSしてプール。なかなか２キロ泳げない。

2006/11/14 (Tue)
　１０時過ぎ起き。赤ずきん本のダウンロード販売開始。今なぜ始めたのか。
体調悪くて寝てた。

2006/11/15 (Wed)
　１０時過ぎ起き。今日も体調良くない。お絵かき。夜はプール。そして
閲覧禁止。

2006/11/16 (Thu)
　１０時半起き。ほとはー外伝３の主線描き。プールに疲れてきた。

2006/11/17 (Fri)
　昨日の夜中にほとはー外伝３描き。AmazonでWii売り切れ……。お絵かき。
プールはお休み。明日早朝にソフマップでWii予約を。

2006/11/18 (Sat)
　徹夜。Wii予約のために横浜ビブレで早朝から並ぶ。Wii予約完了。とりあ
えずひと安心。


////////////////////////////////////////////////////////////////////
// かぶろぐ。
http://d.hatena.ne.jp/kab_studio/

2006/11/12 (Sun)
http://d.hatena.ne.jp/kab_studio/20061112
起きた。
[KAB-studio]ぷらとわ追加。
[KAB-studio][ほとはー]ほとはー外伝３ P.79
[アニメ]「牙」 第33話「失われた輝き」
[アニメ]おねがいマイメロディ〜くるくるシャッフル！〜 
　第33話「元気になったらイイナ！」
[アニメ]乙女はお姉さまに恋してる 
　第6話「夏の日の狂想曲（カプリッツィオ）」
[アニメ]くじびきアンバランス 
　第6話「ぜったいないしょにしておこう。8点」
[アニメ]Gift 〜eternal rainbow〜 第6話「面影」

2006/11/13 (Mon)
http://d.hatena.ne.jp/kab_studio/20061113
起きた。
[水泳ダイエット]11月5回目
[アニメ]金色のコルダ 第7話「秘めやかなデュエット」
[アニメ]夜明け前より瑠璃色な Crescent Love 第6話「お姫様は恋愛禁止!?」
[アニメ]ギャラクシーエンジェる〜ん 第7話「対決！先輩はライバる〜ん」

2006/11/14 (Tue)
http://d.hatena.ne.jp/kab_studio/20061114
起きた……。
[C70][C71][KAB-studio][絵][版権物イラスト]赤ずきん本
　ダウンロード販売開始！
[アニメ]BLACK BLOOD BROTHERS 第7話「銀刀」
[アニメ]N・H・Kにようこそ！ 第19話「青い鳥にようこそ！」
[アニメ]Pumpkin Scissors 第7話「踊る者踊らされる者」

2006/11/15 (Wed)
http://d.hatena.ne.jp/kab_studio/20061115
起きたー。
[link]インスタントストアを作成してみた
[絵]体操服
[link]スク・エニの過去タイトルが復刻！ 
　新廉価版シリーズ「レジェンダリー ヒッツ」が展開 
[水泳ダイエット]11月6回目
[アニメ]DEATH NOTE 第7話「曇天」
[アニメ]ブラックラグーン 第19話「Fujiyama Gangsta Paradise」

2006/11/16 (Thu)
http://d.hatena.ne.jp/kab_studio/20061116
起きた。
[水泳ダイエット]11月7回目
[アニメ]ネギま！？ 第7話「あの、見えなくていいこともあると
　思うんですけど、見えた方がいいことっていうのもあると思うんです」
[アニメ]奏光のストレイン 第4話「リーズナー・セーラ」
[アニメ]武装錬金 第7話「もし君が偽善と疑うのなら」

2006/11/17 (Fri)
http://d.hatena.ne.jp/kab_studio/20061117
起きた。
[link]AmazonでWii売り切れ。
[絵]ひとりでできるもん！
プール休む。
まだ家にいますです。
[アニメ]あさっての方向。 第7話「二人のつかのま」
[アニメ]すもももももも〜地上最強のヨメ〜 第7話「見えない絆」

2006/11/18 (Sat)
http://d.hatena.ne.jp/kab_studio/20061118
おはようございます。
戦闘開始……
さーむーいー
予約券ゲット！
帰ってきた。
[買][装備]Wii予約完了！
[買]コミックスとか。
[きらら]まんがタイムきららMAX 2007年1月号
[アニメ]彩雲国物語 第27話「花は折りたし梢は高し」
[アニメ]おとぎ銃士 赤ずきん 第21話「フェレナンドの贈り物」
[アニメ]ふしぎ星の☆ふたご姫 Gyu! 
　第34話「トーマの辛抱@湯けむり修学旅行」
[アニメ]コードギアス 反逆のルルーシュ 第7話「コーネリアを撃て」


////////////////////////////////////////////////////////////////////
// Ajaxでエロゲーを作るブログ
http://d.hatena.ne.jp/AjaxEroge/

（今週はお休みです）


////////////////////////////////////////////////////////////////////
// 風雅、舞い
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第十五章　濁る澱み、清らかな血溜り　−１１−

「あはぁ〜……こういう時なんて言うんだっけ、ごくらくごくらく？」
　檜の湯船に肩まで浸かって、少年は足を伸ばす。その表情はこれまで見て
きたどの顔よりもリラックスしているように見えて、それだけでも来たかい
があったと舞は感じた。
「時間はたっぷりあるから、ゆっくりしていこーね」
　舞は後ろでまとめた長い黒髪を濡らさないように、肩から湯を掛ける。舞
にとっても、ここは碧き泉を連想させて、心地よい場所だった。
「ん？　……何じろじろ見てるのよ」
　気付けば、洗い場で座っている舞の背を少年はまじまじと見ていた。見た
目が子供とはいえ、オトコノコからじろじろ見られればそれなりに気にはな
る。
「別にそういう意味じゃないよ。先生が前に言ってたんだ、肌に小さな傷が
たくさんあって、練習の跡なんだって」
「そっか。最近治癒の練習もしていて、それでこの前全部治しちゃったんだ
よね。またつけてみようか」
「え？」
　少年が止める間もなく、舞は勢いよく蛇口を開いて、手を横に薙ぐ。
『水流よ我が表層を疾れ！』
　声と共に蛇口から吹き出る水が舞の肌を覆い隠す。高い振動音が外の川の
音さえも掻き消す。
『散！』
　覆っていた水流が飛び散る。玉のような肌が露わになる――その表面に
は、無数の赤い線。
「それが……」
「ま、今のはわざとなんだけどね。最近は体に傷がついてもいいからできる
だけギリギリを流す方がいいかなって思うし、それに簡単に治せるから」
　左手をへその下に当てる。
『内にたゆたう命の波よ、面を覆う数多の瑕を流し落とせ』
　その言葉と共に、体を覆う細かな傷が、逃げるように消えていった。
                                                              (続く)

////////////////////////////////////////////////////////////////////
// JavaA2Z
http://www.kab-studio.biz/Programing/JavaA2Z/index.html

■追加・更新単語

（今週の追加はありません）


////////////////////////////////////////////////////////////////////
◎ ≪----＝ 業務用小型ダーツマシン「ダーツイーグル」

お客さまの少ない、ちょっとした空き時間にダーツタイムを。
壁掛け型で省スペース。これならどんな場所でも設置できます。

『大阪ギフトショー新製品コンテスト大賞受賞！』
http://af1.mag2.com/m/af/0000008658/001/s00000001980002/011

＝~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~＝----≫◎
////////////////////////////////////////////////////////////////////
// #pragma twice
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 17.28
スマートポインタのまとめ

「さて、今回は前回まで説明してきたスマートポインタをまとめます」
『なんかすっごく複雑だったんだけど……』
「まず、スマートポインタの目的は、 new した変数を〈使わなくなった〉
時に delete する、というものです」
『使ってるときに delete しちゃダメだし、 delete し忘れたら
メモリリークしちゃうから、ってことね』
「そういうこと。つまり、 Version 17.21 ( No.376 ) の以下の箇所でして
いる delete を、自動的に行いたいわけです」

int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // 出力用に、 CPrinter クラスのポインタを受け取ります。
    CPrinter *pcPrinter;

    // まずデバッグ用を受け取ります。
    pcPrinter = GetPrinterInstance( DEBUG_PRINTER );
    // 出力します。
    pcPrinter->Output( "あいうえお\n" );
    // 解放します。
    delete pcPrinter;   ←ここと、

    // 次にダイアログ用を受け取ります。
    pcPrinter = GetPrinterInstance( DLG_PRINTER );
    // 出力します。
    pcPrinter->Output( "あいうえお\n" );
    // 解放します。
    delete pcPrinter;  ←ここ。

    return 0;
}

『スマートポインタを使用することで、これが可能になります』

int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // 出力用に、 CSmartPointer クラスを受け取ります。
    // まずデバッグ用を受け取ります。
    CSmartPointer cSmartPointer = GetPrinterInstance( DEBUG_PRINTER );
    // 出力します。
    cSmartPointer.GetPointer()->Output( "あいうえお\n" );

    // 次にダイアログ用を受け取ります。
    cSmartPointer = GetPrinterInstance( DLG_PRINTER );
      ↑ここで以前持っていたポインタを delete します。

    // 出力します。
    cSmartPointer.GetPointer()->Output( "あいうえお\n" );

    return 0;
      ↑ここで持っていたポインタを delete します。
}

『こうすることでメモリリークしなくなるわけね。でも……』
「でも？」
『難しすぎるよこれ！　こんなの絶対作れないし、使うのもかなり無理！』
「うん、難しいと思うよ」
『へ？』
「これは、 C++ 言語の〈一番難しい部分〉です」
『一番難しいとこなの？』
「そう。 C++ 言語には、コンストラクタと演算子のオーバーロードの複雑
なルールがあって、これをパズルのように組み合わせることで
スマートポインタのような特殊なクラスを作ることができるんです」
『パズル……』
「そう、本当にパズル。元々のルール、 C++ 言語の複雑な言語仕様をまず
熟知しなきゃいけないし、それを使いこなせなきゃいけない。それはかなり
大変なこと。これができたら上級者って言ってもいいと思うよ」
『そんな難しい部分なんだ……』
「実際、スマートポインタを作るのはかなり大変です。もしミスがあったら
メモリリークが発生したりまだ使用中なのに delete してしまう可能性があ
るから」
『ミスってどんな？』
「たとえばコピーコンストラクタで参照カウンターを増やし忘れるとか」

    // コピーコンストラクタ。
    CSmartPointer( const CSmartPointer &p_rcSmartPointer )
        : m_pcPrinter( p_rcSmartPointer.m_pcPrinter )
        , m_piRefCounter( p_rcSmartPointer.m_piRefCounter )
    {
                // ← AddRef() を呼んでない。
    }

「これを呼び忘れると、以下の箇所で問題になります」

                           return cSmartPointer;
                                     ↓
    CSmartPointer cSmartPointer = cSmartPointer;
                     (左)              (右)

「右の cSmartPointer はすぐになくなるけど、 AddRef() メンバ関数を呼
び出していないと参照カウンターが 0 になっちゃって」
『げ、その場で delete されちゃう！？』
「というわけ」
『……でもさ、そんなミスってする？』
「するんだよねこれが。たとえば〈コピーコンストラクタを作り忘れた〉と
か」
『……へ？』
「このプログラム、コピーコンストラクタがなくてもビルドできるでしょ」
『げ！　なんで……あ！　そだ、コピーコンストラクタって元々作られてる
コンストラクタだった！』
「そう、 Version 16.11 ( No.338 ) と Version 16.12 ( No.339 ) で説明
したように、コピーコンストラクタは作らなくても元々存在してるんです」
『作らなかった場合、メンバ変数をコピーする……つまり、さっきの 
AddRef() メンバ関数を呼んでないコピーコンストラクタと同じ！』
「そういうこと。だから、スマートポインタにコピーコンストラクタを作り
忘れるとそれだけでバグになるわけです」
『うわぁ……』
「これを忘れないようにするためには、コピーコンストラクタっていうもの
が存在すること、それを自分で作れることを知らないといけないわけです」
『……でも、あのときも思ったけど、見えないところでそういう機能が動い
てる、っていうのを知らないといけないって大変だね』
「だから一番難しい部分、ってこと。こういう〈自動的に行われている部分〉
っていうのは、普通にプログラムを組んでいる時には〈気にしなくてもいい〉
ところなんです」
『だよね、勝手にしてくれて便利ってゆーか』
「だけど、スマートポインタみたいなものを作るためには、その奥まで知っ
ていないといけない、というわけなんです」
『うわぁ……』
「さすがにここまで勉強するのは相当大変だけど、 C++ を使ううえではい
つか必要になる知識だから」
『それまでこつこつ勉強ね……』
「さて、ちょっと話を戻して、さっきはコピーコンストラクタを作らないと
うまく動かない例を見てもらったけど、ちゃんと作ってても使い方次第で
正しく動作しない場合があるんです」
『げ！　それってどんなとき？』
「具体的には、中で持っているはずのアドレスを〈直接〉扱ってしまうと
うまく動きません。たとえば」

    // スマートポインタを受け取りました。
    CSmartPointer cSmartPointer = GetPrinterInstance( DEBUG_PRINTER );
    // このなかにあるアドレスを、取り出してポインタに代入します。
    CPrinter *pcPrinter = cSmartPointer.GetPointer();

『そか、スマートポインタの中のアドレスって GetPointer() メンバ関数で
取得できるんだったね。でもこれがいけないの？』
「これをしてしまうと、ひとつのアドレスが cSmartPointer と pcPrinter 
の両方に入ってることになります。こうなってしまうと、スマートポインタ
では管理しきれません」
『どして？』
「スマートポインタは〈もう参照先の変数を使わなくなったとき〉、つまり
〈アドレスがどのポインタにも入ってないとき〉に delete で削除します」
『うん、それがスマートポインタの目的だもんね』
「でも、普通のポインタにアドレスが入れられていても、スマートポインタ
はそのことは分からないから……」
『げ！　そか、スマートポインタだけ使ってたら〈全部なくなった〉ってい
うことが参照カウンターでわかるけど、普通のポインタも混ざってると……』
「だから、たとえばこういうことが起きてしまいます」

    // ポインタだけ先に作ります。
    CPrinter *pcPrinter;

    // ブロック（実際には if とか for とか）。
    {
        // スマートポインタを受け取りました。
        CSmartPointer cSmartPointer 
            = GetPrinterInstance( DEBUG_PRINTER );
        // このなかにあるアドレスを取り出してポインタに代入します。
        pcPrinter = cSmartPointer.GetPointer();

        // このブロックから抜けると、スマートポインタは
        // 中のポインタを delete してしまいます。
    }
    pcPrinter->Output( "あいうえお\n" );
    // ↑ダメ！　もう delete されたアドレスを使ってます！

『えと、ブロックの中でさっきと同じことしてるんだよね。スマートポインタ
作って、その中のアドレスを外のポインタに渡して……げ！　そか、ブロック
から出るとスマートポインタがなくなっちゃうから……』
「デストラクタが呼び出されて中にあるアドレスが delete されてしまうん
です」
『そうすると、 pcPrinter で持ってるアドレスも同じだから、もう使えな
くて……つまり、普通のポインタを持っていると、こういうふうに使えなく
なったアドレスを持たされるハメになる、と』
「そういうこと。逆に、普通のポインタが、スマートポインタの悪さをする
可能性もあるんです」
『どゆこと？』
「たとえば、勝手に delete しちゃうとか」

    // スマートポインタを受け取りました。
    CSmartPointer cSmartPointer = GetPrinterInstance( DEBUG_PRINTER );
    // このなかにあるアドレスを、取り出してポインタに代入します。
    CPrinter *pcPrinter = cSmartPointer.GetPointer();

// (ここで何か処理)

    // 使い終わったから、ポインタを delete しましょう。
    delete pcPrinter;
    // でもこのあと cSmartPointer 変数でも delete するから
    // 二重に delete されてしまいます……。

『ああーっ！　そか、確かにポインタがあったら delete したくなっちゃう
ね……』
「実際のプログラムではもっと複雑になるから、こういうことはより起こり
やすくなります。で、こういうミスをしないためにも、仕組みを知ってる
必要があるわけです、が」
『それは実はかなり複雑、 C++ じゃ一番難しいレベル』
「でも、ポリモーフィズムでは new や delete は必要不可欠」
『 Version 17.21 ( No.367 ) でそう言われました……』
「だから、ずーっと勉強していったその先に、こういう分野があるっていう
ことを覚えておいて」
『ちょっと忘れたいかも……』

/*
    Preview Next Story!
*/
『なんか今回はへこんだかも……』
「まぁこの辺は本当に難しい部分だからね……」
『ここが一番難しい？　難しいとこってここくらい？』
「あとは const メンバ関数くらいかな」
『げ、イヤなこと思い出させられた』
「というわけで次回」
＜ Version 17.29 継承とコンストラクタ ＞
『につづく！』
「ポリモーフィズムも実はもっと複雑だし、他にもテンプレートとか……」
『いやっもう聞きたくない！！』


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/index.html
・購読登録を解除したいときにはこのページで行なってください。
http://www.mag2.com/m/0000012198.htm
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2006 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

