...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

GetGC/ReleaseDC

学生の皆さんへ.
しばらく動かしているとアプリケーションの実行速度が遅くなってくるとき,リソースリークしてる可能性が高いです.

CDC* pdc = obj.GetDC(); 
...
obj.ReleaseDC(pdc); // これ忘れていない?

気をつけましょう.

まあ,あとは

template <typename OBJ>
class DCHolder
{
  DCHolder(const DCHolder&); // コピー禁止のため
  DCHolder& operator=(const DCHolder&); // コピー禁止のため
  
  OBJ* obj;
  CDC* pdc;
  
public:
  DCHolder(CDC* pdc, OBJ* obj)
  {
    this->pdc = pdc;
    this->obj = obj;
  }
  virtual ~DCHolder()
  {
    obj->ReleaseDC(pdc);
  }
  CDC* GetSafeDC()
  {
    return pdc->GetDC();
  }
};

{
  DCHolder<CStatic> holder(pdc, obj);
  CDC* pdc2 = holder.GetSafeDC();
  // ReleaseDC不要
}

ReleaseDCしなくてもいいようにするとか.

こうしちゃダメですよ.

CDC* pdc2 = DCHolder<CStatic>(pdc, obj).GetSafeDC();

これって禁止できないのかな?