Первый вариант - это умный указатель, второй - необработанный (обычный указатель). Умный указатель вызовет IUnknown :: Release() связанного объекта, когда он будет удален из области видимости. Необработанный указатель не сделает этого, и вы, возможно, получите утечку памяти, если вы не вызовете явный вызов IUnknown :: Release() явно в подходящий момент.
Первый вариант попытается создать экземпляр COM-объекта по его собственной конструкции (поскольку вы используете конструктор, параметризованный с идентификатором класса) и генерируете исключение, если это невозможно. Подробнее см. В источниках для _com_ptr_t (comip.h). Второй вариант даст вам указатель, инициализированный нулем - не связан с каким-либо объектом.
Умные указатели для COM-объектов имеют набор функций-членов, полезных для создания объектов и вызова QueryInterface() - это часто может уменьшить количество кода, необходимого для записи. С необработанным указателем вам придется вызвать CoCreateInstance() с несколькими параметрами, большинство из которых будут установлены по умолчанию, и это заставит вас написать больше кода. Снова см. Comip.h для полных источников _com_ptr_t - они вполне читаемы.
Общая рекомендация - использовать интеллектуальные указатели, если у вас нет реальных причин для этого.
Вы действительно выделяете что-либо во втором? – EFraim