2010-08-24 8 views
7

Decir que tengo el siguiente:operadores de asignación CComBSTR Comprensión

BSTR myBSTR = SysAllocString(L"MYBSTR"); 
CComBSTR myCComBSTR = myBSTR; 

¿Tiene myCComBSTR toma la propiedad de myBSTR y liberarla cuando se sale del ámbito? ¿O hace una copia de myBSTR y produce una pérdida de memoria si no libero myBSTR?

Si esto produce una pérdida de memoria, ¿cuál es la forma más eficiente de manejar esto? (myBSTR se pasará a una función como BSTR y quiero guardarlo como un CComBSTR internamente)

Respuesta

11

En este caso, la instancia CComBSTR crea una copia independiente. Deberá liberar manualmente myBSTR para evitar una fuga.

El método más sencillo para corregir esta situación es saltarse al intermediario SysAllocString función

CComBSTR myCComBSTR = L"MYBSTR"; 

Por otro lado, si usted tiene un BSTR y quieren tener un barco propietario CComBSTR toma de ella a continuación, utilizar adjuntar método . Este método transfiere la propiedad del recurso de la fuente BSTR a la instancia CComBSTR.

CComBSTR myCComBSTR; 
myCComBSTR.Attach(myBSTR); 
+1

¿Cuál es la diferencia entre CComBSTR :: Attach y CComBSTR :: AssignBSTR? –

+0

@ mvdavid7, AssignBSTR no transfiere la propiedad y solo hace una copia. Attach transfiere la propiedad al 'CComBSTR' y no realiza ninguna copia. – JaredPar

Cuestiones relacionadas