STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID *ppvOut)
{
CConMeExtClassFactory *pcf; *ppvOut = NULL; if(IsEqualIID(rclsid,CLSID_ContextMenuExt))
{
pcf = new CConMeExtClassFactory; return pcf->QueryInterface(riid,ppvOut);

} return CLASS_E_CLASSNOTAVAILABLE;
}
CContextMenuExt::CContextMenuExt()
{
m_cRef = 0L;
m_pDataObj = NULL;
g_nDllRefCount++;
}
CContextMenuExt::~CContextMenuExt()
{
if(m_pDataObj)
m_pDataObj->Release(); g_nDllRefCount--;
}

解决方案 »

  1.   

    CConMeExtClassFactory::CConMeExtClassFactory()
    {
    m_cRef = 0L;
    g_nDllRefCount++;
    }CConMeExtClassFactory::~CConMeExtClassFactory()
    {
    g_nDllRefCount--;
    }
      

  2.   

    有new 必然要有delete与之配对 不然就泄露
      

  3.   

    pcf 要记得delete或者你的Release中有计数,释放
      

  4.   

    relaseSTDMETHODIMP_(ULONG) CContextMenuExt::Release()
    {
    if(--m_cRef)
    return m_cRef; delete this; return 0L;
    }
      

  5.   

    pcf = new CConMeExtClassFactory;这也不是局部变量啊。而且类工厂就是创建一次,以后都用他创建其他对象。和你现在的意图相悖。
      

  6.   

    pcf是局部变量 ,在STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID *ppvOut)调用完成后被自动释放,但被pcf所指向的new分配的内存并没被释放,要在pcf被释放前释放掉new分配的内存,不然就内存泄露了
      

  7.   

    由于我有计数,但是在return pcf->QueryInterface(riid,ppvOut);调用失败了会泄露么!
      

  8.   


    pcf会被回收,但它指向的内存需要delete
      

  9.   

    pcf本身是放在栈里,是临时变量,在出作用域后会自动释放;
    但是pcf所指向的内存区域,是new出来的,new的内存是要在堆上开辟,不会自动释放。所以pcf自身(指向内存的地址)被销毁了,但pcf指向的内存地址却没有被销毁,而且指向此内存的地址也没有了,造成无法释放的内存区域。
      

  10.   

    肯定有内存泄露。
    有几个NEW,就要有几个DELETE
      

  11.   

    有new 必然要有delete与之配对 不然就泄露
      

  12.   

    关键是你取出来的ppvOut会不会在减数时释放如果不能pcf 肯定内在泄露了
      

  13.   

    不会的。用new申请的内存是在堆当中分配的。只有调用对应的delete才能释放,
    不然就会泄漏。
      

  14.   


    用了new就是程序员分配而不是系统分配了 所以在函数结束处并不会自己释放,必须程序员手动释放