2016年3月13日日曜日

GetBufferの考え方(MFC)

MFCのGetBufferについて、いろいろとはまった。。。

まだまだ確信を持てないことが多いが、自分なりに理解したことを備忘録として残しておく。



GetBufferはMFCでCStringを利用時に、固定メモリ領域を確保するために利用される。

GetBufferを利用時には同時に確保したいメモリ領域長を指定する必要がある。
例: GetUserName(strName.GetBuffer(UNLEN + 1), &dwNameLength)
参考サイトhttp://rui.primasm.com/2012/12/bug_getbugger_string_1/

その際、ReleaseBufferを忘れないようにする。
また、ReleaseBuffer呼び出し前に、CStringの別関数を呼び出すと、メモリの再確保が行われ、GetBufferの確保領域のポインタが無効になるので、呼ぶような書き方はしないほうが良い。



ちなみに、GetBufferは以下のようの呼び出し方でも問題はない。
デバッガを使用して確認した。

strName.GetBuffer(UNLEN + 1);
GetUserName(strName, NameLength)

この場合でも、GetBufferの返り値と同様のメモリポインタ(LPCTSTR)が渡されていることを確認した。
ただ、結局GetBuffer後はReleaseBufferをするまで、別の関数を呼び出すことは出来ないので、このような書き方はしないほうが良い。

自分は仕事がらみで、この書き方をしてしまい、あとから大分悩んだ 笑。デバッガを使用すれば、ポインタを直接見れることに気付いて、問題ないことを確認した。
自分の戒めのためにも、今後のためにもブログに一応残しておく。

その時にGetBuffer絡みで参考になったサイト
http://www.kab-studio.biz/Programing/PragmaTwice/Main/223.html


ぜんぜん違う話だが、Format関数の%sでCStringを直接利用してはいけないことを知らなくて、驚いた。余談なので、リンクのみ残しておく。
http://drumken.blog8.fc2.com/blog-entry-246.html


今日は以上なり。


0 件のコメント:

コメントを投稿