CComPtr передать по ссылке
У меня есть ситуация, когда мне нужно пройти CComPtr<IXmlReader>
к функции по ссылке. Принимает ли вызываемый параметр владение параметром вызываемого (или) счетчик ссылок увеличивается?
void foo( CComPtr<IXmlReader> & pReader )
{
// There is no reassignment of the CComPtr.
// Just call the IXmlReader methods.
}
CComPtr<IXmlReader> pReader;
foo( pReader );
// Is pReader still valid after the function return ?
Благодарю.
2 ответа
Если нет переназначения, почему это ссылочный параметр?
Несмотря на это, нет никаких изменений в подсчете ссылок. Да, CComPtr все еще действителен после возврата.
Никакой подсчет ссылок не затронут самим вызовом, это только внутренняя манипуляция функции указателем, которая может добавлять или освобождать количество ссылок на объект.
// Действует ли pReader после возврата из функции?
Да, если функция не присвоила значение заново, установив его на NULL
или положить туда новое значение.
Даже если аргумент только для ввода, у программиста есть преимущество в передаче аргументов таким образом: (1) вы полностью находитесь в области интеллектуальных указателей и вам не нужно сильно беспокоиться о правильном подсчете ссылок (2) вы есть ошибка утверждения, например, при попытке ->
неинициализированный указатель (3) при оптимизации сборки выпуска может / может генерировать почти такой же быстрый код, как если бы вы использовали вместо этого необработанный указатель.