In order to convert a database type DB_NUMERIC to real, I noticed that a call to IDataConvert::Release() does not return 0, which is indicative of some additional pointers to the object dangling somewhere. In order to free the object, I would need a loop, which in my case has exactly 19 iterations. Or can it be IDataConvert is actually stack based? In which case I think it is odd that it would retain a reference count at all instead of Release() returning a fixed value. One more Release() at the end does not crash the program, suggesting a stack based object. Of course I don't want my program to leak memory, so would it be safe to ignore the problem and call Release() just once? And of course it is bad to release pointers that you do not own...HRESULT hr;IDataConvert* pConv;hr = CoCreateInstance(CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IDataConvert, (LPVOID*)&pConv);hr = pConv->CanConvert(DBTYPE_NUMERIC, DBTYPE_R8);hr = pConv->DataConvert(DBTYPE_NUMERIC, DBTYPE_R8,  (ULONG)sizeof(DB_NUMERIC), &len, (void*)&test.m_cur, (void*)&result, sizeof(result), DBSTATUS_S_OK, &status, test.m_cur.precision, test.m_cur.scale, DBDATACONVERT_DEFAULT);UINT n;int i = 0;while (n = pConv->Release()) // this strange looking code seems the only way to make Release() return 0{    i++;}//n = pConv->Release(); // for testing purpose only, an extra release does not crash the program. 
IDataConvert::Release() does not return 0
c++;com