http://msdn.microsoft.com/zh-cn/magazine/cc163361.aspx 这是msdn关于COM连接点的文章,我下载了其中的例子,编译运行一切都正常,不过我发现一个问题,接收器的实例:class CSink : _IAddEvents
{
    private:
    DWORD       m_dwRefCount;
    public: CSink::CSink() {m_dwRefCount = 0;}
CSink::~CSink() {} HRESULT STDMETHODCALLTYPE AdditionStarted()
    {
printf("C++ SINK: Addition started event fired ... \n");
        return S_OK;;
    }; HRESULT STDMETHODCALLTYPE AdditionCompleted(int nResult)
    {
printf("C++ SINK: Addition completed event fired ... \n");
printf("C++ SINK: Addition result: %d \n",nResult);
        return S_OK;
    }; HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
    {
        m_dwRefCount++;            
        *ppvObject = (void *)this;
        return S_OK;
    }; ULONG STDMETHODCALLTYPE AddRef()
    {
        m_dwRefCount++;
        return m_dwRefCount;
    };
    
ULONG STDMETHODCALLTYPE Release()
    {
        ULONG l;
        l  = m_dwRefCount--;
        if ( 0 == m_dwRefCount)
        {
            delete this;
        }
        return m_dwRefCount;
    }; HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pI)
{
return E_NOTIMPL;
}; HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID  riid, 
OLECHAR FAR* FAR*  rgszNames, 
unsigned int  cNames, 
LCID   lcid,
DISPID FAR*  rgDispId)       
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTinfo, LCID lcid, ITypeInfo FAR **ppTIinfo)
{
return E_NOTIMPL;
} HRESULT STDMETHODCALLTYPE Invoke(DISPID  dispIdMember, 
REFIID  riid, 
LCID  lcid, 
WORD  wFlags,
DISPPARAMS FAR*  pDispParams, 
VARIANT FAR*  pVarResult,
EXCEPINFO FAR*  pExcepInfo,
unsigned int FAR*  puArgErr)
{
HRESULT hr = S_OK;
if(pDispParams)
{
switch (dispIdMember)
{
case 1:
return AdditionStarted();
case 2:
return AdditionCompleted(pDispParams->rgvarg[0].iVal);
default:
return E_NOTIMPL;
}
}
return E_NOTIMPL;
}

};在使用时是 pSink = new CSink(); 但程序中却没有delete ,我觉得这样有可能会导致内存泄露,我在最后加了 delete pSink; 
pSink = new CSink();;
    if ( NULL == pSink ) { return; }    // Get the interface pointer to CSink's IUnknown pointer which we 
// will pass to the server
//
hr = pSink->QueryInterface (IID_IDispatch,(void **)&pSinkUnk);
if(!SUCCEEDED(hr)) { return;}

// Pass the sink interface to the server through the Advise
// 
hr = pCP->Advise(pSinkUnk,&dwAdvise); 
if(!SUCCEEDED(hr)) { return;} // Call a method on the server and forget it. We should 
    // get an event back to our sink method that we registered 
// through Advise
//
    pAdd->Add(1, 5);
   
// Unadvise the event call back we registered.
//
if(pCP != NULL) { pCP->Unadvise(dwAdvise); }  if(pSinkUnk != NULL) { pSinkUnk->Release();} // Disconnect from the server
//
    if(pCP != NULL) { pCP->Release(); }
 
// Release interfaces
//
if(pAdd != NULL) { pAdd->Release(); } delete pSink; CoUninitialize();
return;不过程序却在这句出错了,本人com水平有限,请问各位大侠,为什么new出来的实例,delete会出错呢?