Объекты Microsoft, функции Release () возвращают значение? - PullRequest
6 голосов
/ 20 мая 2009

Мне любопытно, потому что я не мог узнать об этом на MSDN. Я обнаружил, что функция Release() присутствует в различных COM-объектах, которые я, очевидно, должен использовать для удаления указателей. Но я не уверен, что именно он возвращает? Раньше я думал, что он вернет количество ссылок, которые все еще существуют на оставшийся объект, поэтому что-то вроде:

while( pointer->Release() > 0 );

Очевидно, освободит все ссылки на этот указатель?

Или я чего-то не вижу?

* примечание Я говорю об этом из концепции IDirect3DTexture9::Release() функции

Ответы [ 3 ]

11 голосов
/ 20 мая 2009

В дополнение к тому, что сказал Mehrdad, возвращаемое значение Release предназначено только для целей отладки. Производственный код должен просто игнорировать его.

Цикл до тех пор, пока Release () не вернет 0, определенно является ошибкой - вы никогда не должны выпускать ссылки, которые вам не принадлежат.

10 голосов
/ 20 мая 2009

Ваша теория верна. Управление памятью COM основано на подсчете ссылок. Метод Release интерфейса IUnknown будет уменьшать счетчик ссылок и возвращать его. Эта функция не освобождает ссылки . Он не знает, кто держит ссылку. Он просто уменьшает счетчик ссылок, пока не достигнет нуля, и тогда объект будет уничтожен. Это опасно, поскольку другие могут все еще иметь ссылку на него, который станет недействительным после уничтожения объекта.

Таким образом, вам следует звонить Release только за каждый AddRef, который вы ранее звонили.

6 голосов
/ 20 мая 2009

Release () возвращает текущий счетчик ссылок объекта. Но вы не должны делать:

while( pointer->Release() > 0 );

Это сделает счетчик ссылок нулевым и уничтожит объект.

В COM простым правилом большого пальца является каждый AddRef () должно быть соответствующее Release () (только один).

Обычно реализация Release () будет выглядеть так:

int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count
if (nCount == 0) 
{
    delete this;
}
return nCount; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...