В чем разница между размещением объекта указателя следующими двумя способами? - PullRequest
0 голосов
/ 22 июля 2009

Я создал компонент COM с именем Test.dll, в котором я создал интерфейс IDiscover.

Теперь я пришел к 2 способам выделения памяти как

  IDiscoverPtr id(__uuid(TestClass)); and Test::IDiscover *id=NULL;

В чем разница между этими двумя .... Любая информация приветствуется ..

Ответы [ 2 ]

2 голосов
/ 22 июля 2009

Первый - это Smart Pointer, а второй - обычный указатель.

Вам не нужно беспокоиться о Releasing Smart Pointer, тогда как вы должны явно Release() обычный указатель COM-интерфейса.

Для получения более подробной информации об интеллектуальных указателях Смотрите здесь

Кроме того, первый попытается найти GUID из реестра для вашего класса с именем TestClass и попытается создать экземпляр этого класса с помощью CoCreateInstance API Call. Он попытается получить указатель на интерфейс IDiscover через указанный вызов CoCreateInstance и выдаст ошибку, если это не удастся сделать. При успешном выполнении строки IDiscoverPtr id(__uuid(TestClass)); у вас должен быть действительный указатель интерфейса IDiscover в id.

Второй - просто объявление указателя интерфейса, ничего больше. Вам придется создавать его самостоятельно (в большинстве случаев) CoCreateInstance или один из его вариантов.

1 голос
/ 22 июля 2009

Первый вариант - умный указатель, второй - необработанный (обычный указатель). Умный указатель вызовет IUnknown :: Release () связанного объекта, когда он сам выйдет из области видимости. Необработанный указатель не сделает этого, и вы, возможно, получите утечку памяти, если не вызовете IUnknown :: Release () связанного объекта явно в подходящий момент.

Первый вариант будет пытаться создать экземпляр COM-объекта по своей собственной конструкции (поскольку вы используете конструктор, параметризованный с помощью идентификатора класса) и сгенерировать исключение, если это невозможно. Посмотрите источники для _com_ptr_t (comip.h) для деталей. Второй вариант даст вам указатель, инициализированный нулем - не связанный ни с одним объектом.

Умные указатели для COM-объектов имеют набор функций-членов, полезных для создания экземпляров объектов и вызова QueryInterface () - это часто может уменьшить объем кода, необходимого для записи. С необработанным указателем вам придется вызывать CoCreateInstance () с несколькими параметрами, большинство из которых вы установите на значения по умолчанию, и это заставит вас писать больше кода. Снова смотрите comip.h для получения полных источников _com_ptr_t - они вполне читабельны.

Общая рекомендация - использовать умные указатели, если у вас нет реальных причин поступить иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...