我用ATL做了个组件 CoCreateInstance后故意不Release。 VC.net2k3没有任何警告 怎么回事? 难道没有对ATL自动检查内存泄漏的功能?

解决方案 »

  1.   

    内存泄漏其实很好检查,我从不借助任何工具,还是相信自己写一些debug代码要踏实的多。例如,写这样一个类
    #ifdef _DEBUG
    template<class T>
    class CCheckObjrefT {
    public:
      class _ObjrefLock {
      public:
        _ObjrefLock() : m_nLock(0) { }
        ~_ObjrefLock() { _ASSERTE(m_nLock == 0); }
        long Lock() { return InterlockedIncrement(&m_nLock); }
        long Unlock() { return InterlockedDecrement(&m_nLock); }
      private:
        long m_nLock;
      };  CCheckObjrefT() { GetLock()->Lock(); }
      ~CCheckObjrefT() { GetLock()->Unlock(); }
      static _ObjrefLock* GetLock(){
        static _ObjrefLock _lock;
        return &_lock;
      }
    };
    #define CHECKOBJREF(cls) CCheckObjrefT<cls> m_checkobjref##cls;
    #else
    #define CHECKOBJREF(cls)
    #endif
    这样,你每写一个class的时候,都加一个记录引用的成员即可,例如
    class A
    {
      CHECKOBJREF(A);
    };
    如果某个class没有释放,CCheckObjrefT<T>::_ObjrefLock::~_ObjrefLock()函数里面的_ASSERTE()必然失败。
    这个方法只能用于检验成员变量和局部变量,对全局变量不保障,因为根据C++参数堆栈规则(对全局变量谁先调用谁先构造,谁先进栈谁后出栈),如果A a是个全局变量或者静态变量的话,它在静态计数器构造之前建立,因此它在计数器的底部,所以计数器先在它之前先行释放了,所以在~A()后访问引用计数器就不是先前的值了。不过全局变量简单,一般不会因为全局变量而出现内存泄漏,因此我认为这就足够了。