一大堆人对IUnknown的错误用法

背景略过...,检查代码,发现公司项目里某代码片段(为节省篇幅,片段经过重写,并以省略号代替部分次要函数的实现)如下:

template< class _Bty > class CUnknownImpl : public _Bty
{
public:
	STDMETHOD( QueryInterface )(
		_In_ REFIID iid,
		_Deref_out_ void** ppvObject) throw()
	{
		...
	}

	STDMETHOD_( ULONG, AddRef )()
	{
		return InterlockedIncrement( &m_dwRef );
	}

	STDMETHOD_( ULONG, Release )()
	{
		DWORD dw = InterlockedDecrement( &m_dwRef );
		if( !dw )
			delete this;
		
		return dw;
	}
};

以上代码片段用以实现IUnknown接口。

以及这段:

__interface IErrorMessage : public IUnknown
{
	virtual DWORD GetLastError() PURE;
	virtual DWORD GetLastErrorMessage( __out_ecount_full_z( cchErrorMessageBufferSize ) LPWSTR lpErrorMessageBuffer,
		__in DWORD cchErrorMessageBufferSize ) PURE;
};

class CErrorMessageImp : public CUnknownImpl < IErrorMessage >
{
public:
	virtual ~CErrorMessageImp()
	{
		// 试图在析构函数中释放由HeapAlloc分配的内存(m_pszMessage )
		ENSURE( HeapFree( GetProcessHeap(), IGNORE, m_pszMessage ) );
		m_pszMessage = NULL;
		m_cchMessageLength = 0;
	}

	virtual DWORD GetLastError()
	{
		...
	}

    virtual DWORD GetLastErrorMessage( __out_ecount_full_z( cchErrorMessageBufferSize ) LPWSTR lpErrorMessageBuffer,
		__in DWORD cchErrorMessageBufferSize )
	{
		Copy m_pszMessage to lpErrorMessageBuffer ...
	}
	
    VOID SetMessage( LPCWSTR lpMessage )
	{
		m_pszMessage = HeapAlloc( ... );
		Copy lpMessage to m_pszMessage;
	}
private:
	_Field_size_( m_cchMessageLength )WCHAR *m_pszMessage;
	DWORD m_cchMessageLength;
};

这是我能看到,搜索到的绝大多数人,和贴子里对IUnknown接口的实现方法。没有虚析构函数!许多悲惨的程序员花费很大代价才学到这堂课 —— 《Effective STL》我指 “勿照抄代码” 和独立思考;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值