2012-09-21 10 views
5

ja jadę przez jakiegoś starszego C++ kod do czynienia z biblioteką komponentów Windows Imaging i zauważyłem to:Podjęcie CComPtr do funkcji z prototypem surowy wskaźnik

void setProperties(IPropertyBag2* const pBag) 
{ 
    pBag->Write(...); 
} 

void other_function() 
{ 
    CComPtr<IPropertyBag2> pBag; 
    //Code to initialize pBag 
    setProperties(pBag); 
} 

Sposób setProperties prostu pisze pęczek właściwości do worka nieruchomości. Kod kompiluje się i działa poprawnie, ponieważ myślę, że wywołuje odpowiedniego operatora typecasting.

Moje pytanie brzmi, czy taki interfejs jest zalecany, czy jest lepszy sposób na przekazanie wskaźnika. Na przykład, jest jakaś różnica (pod względem bezpieczeństwa/wydajność) jeśli podpis został zmieniony na:

void setProperties(const CComPtr<IPropertyBag2>& pBag) 

Odpowiedz

2

Wskaźniki surowych interfejsów to kanoniczny sposób pracy z obiektami COM. Są też najbardziej elastyczne. Użycie odwołania do CComPtr spowoduje, że będziesz zawsze korzystać z CComPtr.

Każdy wskaźnik COM, nawet głupi, jest automatycznie inteligentnym wskaźnikiem, ponieważ sam obiekt implementuje AddRef i Release. Jeśli funkcja nie zachowuje kopii wskaźnika, nie ma potrzeby się o to martwić.

Typ CComPtr automatycznie rzuci się do surowego wskaźnika dla wygody.

+3

Użycie parametru CComPtr nie będzie wiązało się z używaniem zawsze CComPtr, ponieważ konstruktory CComPtr nie są jawne. Surowe wskaźniki interfejsu nie są inteligentnymi wskaźnikami. Zapomnienie o zwolnieniu obiektu spowoduje jego nieszczelność. Ma wszystkie te same problemy, co zapomnienie o "usunięciu" pamięci przydzielonej z "nowym". – user1610015

1

Nie ma wiele zalet przy użyciu parametru CComPtr (chyba że jest non-const i ty” zamierzam go zmodyfikować). CComPtr jest bardziej przydatny dla zmiennych lokalnych i zmiennych instancji.

Ale można to zrobić, choćby ze względu na styl/konsystencję.