閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

2008-03-01から1ヶ月間の記事一覧

GetProcAddressで戻り値をキャストするのが面倒くさいので少し考えてみた

C++

その1。 typedef void (__stdcall * Func)(); template<class F> F GetProcAddress2(HMODULE module, LPCSTR name) { F f = reinterpret_cast<F>(::GetProcAddress(module, name)); _ASSERT(f); return f; } Func f = GetProcAddress2<Func>(dll, "Func"); ってASSERT挟んだだ</func></f></class>…

非ポインタ型の変数にポインタを代入

C++

struct A { A(A* = 0) {} void foo() {} }; int main() { A obj = new A(); obj.foo(); return 0; } 上記のコードはコンパイルも実行も普通にできます。最初見たときはちょっとびっくりしましたが、普通にコンストラクタが呼ばれるんですね。当然、 new で確…

cl.exeを落とす

C++

以下のコードをコンパイルすると cl.exe が強制終了します。バージョンは VC8 。 #include <boost/bind.hpp> struct Hoge { void foo(int) {} }; void main() { Hoge hoge; boost::bind(&Hoge::foo, hoge); } まぁコンパイルの通らないコードなので落ちても構わないのですが</boost/bind.hpp>…

BOOST_FOREACH で std::map を使うとエラーが出る事がある

C++

#include <map> #include <boost/foreach.hpp> void f() { std::map<int, int> m; BOOST_FOREACH(std::map<int, int>::value_type const& iter, m) { } return 0; } これ VC8 でコンパイルが通りません……。エラーが大量に出るのですが、その前に BOOST_FOREACH の引数が多すぎると言う警告(C4002)が出るの</int,></int,></boost/foreach.hpp></map>…

new をオーバーロードしてメモリリークを自力で検出

C++

new や malloc を自分で定義すればメモリ領域を確保する度にそれを記録することができます。前のエントリで VC++ でメモリリークの検出を行えるようにしてみましたが、それをとても簡略化したものを試しに自分で実装してみました。かなりいい加減ですが(テス…

メモリリークの自動検出をしてみる

VC++ のライブラリにはメモリリークの検出機能があります。関数ひとつ呼んでおくだけでアプリケーション終了時にメモリの解放漏れを出力ウィンドウに表示してくれるという便利なものなのですが、実際にこれを使うまでの過程に罠が多いのでメモしておきます。…