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)
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