Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, <Аноним>, Вы писали:
А>>Этот самый GUI использует COM объект с методом, в который
А>>передается другой COM объект ([in] параметр)
А>>Так вот бормановские врапперы похоже вызывают на один Release
А>>меньше, чем положено и в итоге имею кучу leak'ов.
OE>да, тоже наступали на это дело, если передавать параметром указатель на интерфейс, дебилдер в реализации метода лепит вокруг него свою обертку и при заключении переданного указателя на интерфейс в эту обертку делает AddRef(), но в деструкторе обертки никаких Release() нету. Пришлось вставлять в каждый такой дебилдерный метод принудительный Release() для соблюдения баланса
Позволю не согласится.
В BCB5
Обертка, которая используется для передачи интерфейса генерится следующим образом
typedef TComInterface< <имя интерфейса>, <IID> > <имя интерфейса>Ptr
где
template <class T,
const IID *piid = &GUID_NULL> /* NOTE: The IID parameter is for backward-compatibility*/
/* New code should rely on __uuidof(intf) support */
class TComInterface
{
public:
TComInterface() : intf(0)
{}
// NOTE: The default behaviour of the constructor is to not AddRef the interface
// pointer parameter. This is appropriate if the interface was obtained
// has already been addRef'ed - as when retrieving a Font property.
//
TComInterface(T* p, bool addRef = false)
{
if (((intf = p) != 0) && addRef)
intf->AddRef();
}
.....
TComInterface(const TComInterface<T, piid>& src)
{
if ((intf = src.intf) != 0)
intf->AddRef();
}
// NOTE: This assignment operator does *NOT* addRef the interface pointer being
// assigned to this object.
//
TComInterface<T, piid>& operator=(T* p)
{
Bind(p);
return *this;
}
TComInterface<T, piid>& operator=(const TComInterface<T, piid>& src)
{
if (src.intf != 0)
src.intf->AddRef();
Reset(src.intf);
return *this;
}
.....
void Reset(T* p = 0)
{
if (intf)
intf->Release();
intf=p;
}
~TComInterface()
{
Reset();
}
Видно, что Release() вызывается всегда.
Так что скорее должен вызываться лишний Release(). |