Здравствуйте, 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().
Автор: Sergei    Оценить