Есть ли аналог «CreateInstance»? - PullRequest
3 голосов
/ 19 апреля 2011

У нас есть некоторый код, который использует MSXML и делает это для создания объекта документа XML:

MSXML2::IXMLDOMDocumentPtr  doc_in;

doc_in.CreateInstance("Msxml2.DOMDocument.6.0");

Как только мы закончили с doc_in, как мы его уничтожим? Это просто автоматически уничтожается, когда doc_in выходит из области видимости, или что?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Управление временем жизни COM-объектов основывается на подсчете ссылок с помощью IUnknown s методов AddRef() и Release().Подробнее см. «Использование и внедрение IUnknown» , в частности «Правила управления счетами ссылок» .

Помимо этого используются умные указатели, чаще всего ATL CComPtr / CComQIPtr и _com_ptr_t.

Итак,если вы имеете дело с простым указателем на экземпляр COM, вам придется вручную Release() отказаться от владения.
Если у вас есть умный указатель на экземпляр COM, вам нужно будет сделать Release(), когдаЭкземпляр умного указателя выходит за рамки видимости, но, чтобы убедиться, что вы посмотрите на документацию по фактическому классу умного указателя, который вы используете.

3 голосов
/ 20 апреля 2011

Если IXMLDOMDocumentPtr является умным указателем (как он выглядит), то он позаботится о вызове doc_in.Release () для вас.

...