////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2003/06/02(Mon) No.209
    配信数： 3170 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００３年６月２日（月）の更新                  */
http://www.kab-studio.com/

・ほとはー１話追加！
　三人合体ホットハーブに１話追加。第５話スタート！　って、のっけから
なんかあれだなぁ……。
[ 三人合体ホットハーブ ]
http://www.kab-studio.com/Comic/HotHerb/


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.com/nikki2/

2003/05/24 (Sat)
　作者旅行のためお休み。

2003/05/25 (Sun)
　作者旅行のためお休み。

2003/05/26 (Mon)
　作者旅行のためお休み。

2003/05/27 (Tue)
　旅行から帰宅。沖縄は雨だった。スリリングスキューバ。３日目は前に
行ったところをもう一度。デジカメ大活躍。そしてめがねっ娘。そして派生
クラス。そしてラジオ録音。

2003/05/28 (Wed)
　会社が面白いことに。１日で HTTP 叩くアプリを作ることに。久々残業。
歯が痛い……。マリみてバレンタイン編良かった。そしてタスクトレイ。
そして無人島。

2003/05/29 (Thu)
　昨日の続きの HTTP アプリ。 UpdateWindow() と mbstowcs() 。 CD-RW 
ドライブやバーチャロンマーズとか購入。そしてチャロンマーズ。そして
this ポインタ。そして COBOL 。そして DLL の動的リンク。

2003/05/30 (Fri)
　起きたら出る時間。 HTTP アプリが本番環境でバグる。なぜか本文取れて
ない。 Tomcat を立てるために kab-studio.biz を止めます。そしてチャロ
ンマーズ。

2003/05/31 (Sat)
　忙しい。 CD-RW ドライブ設置。昨日のお仕事。「全部取りきる」って難
しい。ほとはー。新ツッコミシステム。チャロン対戦。そしてチャロン。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.com/Novel/Fuga/

■　第七章　告白　−１０−

　舞は、穏やかに目を覚ました。
　星の見えない空、木々のざわめき。闇の中で周りを見回して、状況を把握
する。腕時計は深夜３時を指していた。
「……？」
　雅樹がいないことに気づく。
「どこ……あ」
　が、すぐに判る。右前方に強い『水』の感触。おそらく１０メートル四方
ほどの池。同時に、その中の異物も感じ取れる。朱き泉の力、強いプレッ
シャー。
　訓練しているのかもしれない、なら参加しない手はない。自分の能力を存
分に出して練習できる相手はそうそういなかった。
「そういえば、リシュネ、どうしたかな……」
　すぐ闇に吸い込まれる独り言を言いつつ、池へと近づこうとした時、その
池から続く小川も発見する。
　……できるかな。
　舞は声を潜め、胸に手を置き、深呼吸をする。穂香さんが見ていたら一発
でばれるけど、そのときはそのとき……。
　小川にくるぶしまで浸かり、小さな岩に腰を下ろし、手を伸ばす。手のひ
らが、水面に張り付く。
『……だろうけど……』
　雅樹の、声。
　同時に、池に立つ雅樹の姿も浮かぶ。
「！っ！！」
　左手で胸元を掴み、必死で心音を抑え込む。
　こんな、素っ裸ってぐらいで動揺してどうするのよ！！
　水面を伝って舞に雅樹の姿を感じ取らせている。見ているのではなく、感
じる。だから、全裸で湖底に立つ雅樹の姿も生々しく把握できる。
　左手をきゅっと握りしめ、そのまま心臓も抑えつけるようにして、ゆっく
りと深呼吸をし、息が穏やかになっていく。
「……はぁ」
　深呼吸と言うよりはため息のような息を吐いて、再び、耳をそばだてる。
水面を波立てる雅樹の声を、感じ取る。
『だから、その話はもういいだろう！！』
　大声を上げる雅樹に、舞は驚いた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『あたしは矢鴨かよ……』
「ま、まぁすごく目立たないところだし……」
『全然慰めになってないし……』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 11.09
メモリを動的に確保する

「前回見たように、 CString は文字列の長さに関係なく格納することがで
きます」
『つまり、配列だとサイズが固定だけど、そうじゃない方法で可変にしてそ
んなかに入れてるわけよね』
「そういうこと。これを【メモリの動的確保】って言います」
『動的？』
「実行中にってこと。普通の変数はサイズが変わらないから、プログラムを
コンパイルした時点でもう決まってるから」
『それは動的じゃないわけね』
「というわけで、まずは試してみます。方法はいくつかあるんだけど、今回
はランタイムを使います」

void AllocAndFree()
{
    // このデータが入る領域を確保します。
    const char *const DATA = "あいうえお";

    // まず確保。
    char *pch = (char *)malloc( strlen( DATA ) + 1 );

    // コピーしてから出力。
    strcpy( pch, DATA );
    TRACE( "%s\n", pch );

    // 解放します。
    free( pch );
}

『初めて見るのばっかって感じ』
「まず、このプログラムは」

    const char *const DATA = "あいうえお";

「が入る領域をメモリに確保して、その中にコピー、それを出力、ってする
プログラムです」
『つまりこの文字列がどんなに長くても問題ないってことね』
「そういうこと。そこで、まずこの文字列が入る領域を確保します」

    // まず確保。
    char *pch = (char *)malloc( strlen( DATA ) + 1 );

『 malloc() がそのランタイム？』
「そう。 malloc() は、引数で渡されたバイト数だけ、メモリを確保しま
す」
『その、メモリを確保するって……』
「まずメモリウィンドウを想像して」
『ほい想像した』
「その中は、変数として使われてるところもあれば、使われてないところも
あります」
『だね』
「雰囲気としては、野球場の指定席」
『へ？』
「野球場の観覧席、その指定席がメモリ。もう場所が取られてるところもあ
れば、まだ空いてるところもあります」
『うん』
「メモリを確保するってことは、ぴあとかに頼んで席を予約すること」
『ああ！　そういう意味の確保なんだ』
「引数として渡した数字が、その確保した大きさ、つまり席の数ってことに
なります」
『戻り値は？』
「戻り値はポインタ。予約した席が並んでたら、その並びの最初の席番号っ
てことになるかな」
『最初の……って、配列のポインタみたいだね』
「というかそのまま。 Version 5.03 ( No.068 ) でも教えたように、ポイ
ンタはそのまま配列としても使えるわけだから」
『ってことは』

    char *pch = (char *)malloc( strlen( DATA ) + 1 );

『は』

    char pch[ strlen( DATA ) + 1 ];

『って考えちゃえばいいんだ』
「まぁそういうこと。だから」

    // コピーしてから出力。
    strcpy( pch, DATA );
    TRACE( "%s\n", pch );

「っていうふうに、普通に使えます」
『これはいつも通りね』
「配列と違うのは、確保したら解放しなきゃいけないってこと」

    // 解放します。
    free( pch );

『予約しっぱなしじゃダメってこと？』
「そういうこと。当たり前だけど、 malloc() で確保した領域と同じ領域を
malloc() が返すことはないでしょ」
『？』
「たとえば１０バイト malloc() に頼んで 0x00000001 ってアドレスが返っ
てきたとします。そうしたら、もう一度呼んだときに malloc() が 
0x00000001 を返す事はないってこと」
『返されたら……他で使ってるとこに上書きとかしちゃうものね』
「それに、確保した領域の範囲ももちろん返しません。 0x00000005 とかも
返らないってこと」
『ってゆーか、それはさっきの野球の席の話でもそうよね。ダブルブッキン
グになるんだから』
「ってことは、 free() で〈もう使いません〉って言うまでは、 
0x00000001 - 0x00000010 は malloc() が返さないから使えない、ってこ
と」
『？　だって、最初にもらってあるんだからそれ使えばいいんじゃない』
「そのポインタをちゃんと取ってあるんなら、ってこと」

void AllocNotFree()
{
    // このデータが入る領域を確保します。
    const char *const DATA = "あいうえお";

    // まず確保。
    char *pch = (char *)malloc( strlen( DATA ) + 1 );

    // コピーしてから出力。
    strcpy( pch, DATA );
    TRACE( "%s\n", pch );

    // 解放……しません。
    // free( pch );
}

「っていうように、もし free() し忘れたら、 pch の中のアドレスはもう
どうやってもわからないから」
『使うこともできないし、 free() もできない……』
「この、メモリ領域が無駄になることを【メモリリーク】って言います」
『リーク？』
「英語で leak 、〈漏れる〉って意味。メモリが漏れてなくなるって意味か
な、ちょっとわかりづらいけど」
『なんか英語的かも……』
「で、実際にメモリリークが影響する部分だけど、大きい場合もあれば小さ
い場合もあります」
『そなの？』
「まず、 Version 8.04 ( No.146 ) で言ったように、メモリ領域はプロセ
スごとに違うから、 malloc() しっぱなしのアドレスが確保できない、って
のは自分のプログラムだけの話」
『そっか、このプログラムが 0x00000001 を確保してメモリリークしちゃっ
ても、他は関係ないから 0x00000001 を確保できたりするんだ』
「ただ、物理的なメモリは取っちゃうわけだから」
『げ、メモリリークしまくったらメモリが無駄に消費されちゃう』
「そういうこと。でも、実は malloc() した領域は、アプリが終了すると全
部解放されるんです」
『へ？　確保しっぱなしじゃないの？』
「しっぱなしじゃないんです。だから終了しちゃえばリセット」
『なんだ、問題ないんじゃない』
「っていうのは間違い」
『え”』
「プログラムをどう使うかはユーザー次第。ダイアログアプリで、１年間終
了せずに使いっぱなしにされることだってあるんだから」
『そっか、それを１分で終了させるか１年間終了させないか、なんてわかん
ないもんね……』
「昔は実行したらすぐ終わるプログラムが多い事もあって〈解放しなくても
いい〉って風潮があったんだけど、今はウィンドウプログラムだから」
『いつ終わるかわからない、だからメモリリークはちゃんとチェックしない
とダメ』
「ってことになります。で、チェックの方法について。さっきのプログラム
を実行して終了すると、こんなメッセージが出ると思います」

Detected memory leaks!
Dumping objects ->
{69} normal block at 0x004215A0, 11 bytes long.
 Data: <           > 82 A0 82 A2 82 A4 82 A6 82 A8 00 
Object dump complete.

『うん、出てる。あ！　〈 memory leaks 〉って出てる！』
「そう、メモリリークするとそれを自動的に検出してくれるんです。 
malloc() で確保したポインタは中で取ってあって、アプリが終了する時に解
放し忘れてるポインタがないかチェックしてくれるから」
『こういうふうにわかるわけね』
「ただ、このメッセージそのものはちょっとわかりにくいかな。見方は、ま
ず」

{69} normal block at 0x004215A0, 11 bytes long.

「この行だけど、 69 はポインタの番号みたいなので、中の話だから特に
気にしなくていいです。 0x004215A0 はメモリリークしたアドレス、つまり
malloc() で返ってきたアドレス」
『じゃあ malloc() したアドレス全部出力すれば』
「まぁ一応はわかるけど、ちょっと大変だね……。 11 は malloc() で確保
したサイズ。で、次」

 Data: <           > 82 A0 82 A2 82 A4 82 A6 82 A8 00 

「この <> の中は、実際にそのポインタに入ってるデータを文字列化したも
の、その右側の 82 A0 とかは１バイトずつ１６進数で表記したもの」
『文字列化したの、空欄だから全然わかんないんだけど』
「日本語が出力できないからこうなっちゃってるんだよね。それよりは右の
１６進表記を見た方がいいかも」
『そっちだってわかんないし』
「わかんない？」
『へ？』
「前に見たことあると思うけど」
『うーん……』
「 Version 11.05 ( No.205 ) でやったでしょ、 "あ" の文字コードは？」
『 0x82 0xA0 ……あ！！』
「というわけ。だいたいこれで中身がわかるから、それもヒントになるか
な」

/*
    Preview Next Story!
*/
『わけわかんないこと書いてあるっぽくても、わかるもんなのね』
「ちゃんとわかれば、難しいことなんて本当に少ないよ」
『うー、なんか説得力ない』
「そんなことないって。次の話も結局はペアになるっていう話」
『ペア？』
「というわけで次回」
＜ Version 11.10 いろいろあるメモリ確保の方法 ＞
『につづく！』
「プログラムは〈作った〉ものなんだから、基本は単純なんだって」
『ホントかなー』


////////////////////////////////////////////////////////////////////
/*                ２００３年６月９日（月）の更新                  */
http://www.kab-studio.com/

・ほとはー１話追加予定
　三人合体ホットハーブに１話追加予定です。６月は毎週追加するよー。

・KAB-studio.h 縮刷版更新
　KAB-studio.h が２１０号になるので縮刷版を更新します。


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

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


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

    (C)KAB-studio 1999 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////

