2010-04-20 17 views
7

Al asignar un nuevo BSTR con SysAllocString a través de un wchar_t * en el montón, ¿debo liberar el wchar_t * original en el montón?¿Puedo liberar memoria pasada a SysAllocString?

¿Así que esta es la manera correcta?

wchar_t *hs = new wchar_t[20]; 
// load some wchar's into hs... 
BSTR bs = SysAllocString(hs); 
delete[] hs; 

¿Se supone que debo llamar a eliminar aquí para liberar la memoria? ¿O acaso ese BSTR ha creado ese recuerdo?

+0

especie de divertido - Estoy totalmente de malinterpretar las variables cuando me envió mi respuesta (que posteriormente he borrado). Yo "vi" eliminar [] bs; en lugar de hs Debo necesitar gafas nuevas. –

Respuesta

9

Como su nombre lo indica, SysAllocString asigna su memoria, no "adopta" la memoria de su argumento. Los BSTR tienen el prefijo de tamaño y terminados en nulo, por lo que "adoptar" una cadena estilo c es imposible, ya que no hay espacio para el prefijo de tamaño.

3

Sí, delete la memoria.

10

SysAllocString(), desde el documentation, se comporta de esta manera:

Esta función asigna una nueva cadena y copia la cadena que se pasa en ella.

Así que, sí, una vez que haya llamado a SysAllocString, puede liberar su matriz de caracteres original, ya que los datos se han copiado en el BSTR recién asignado.

La forma correcta de liberar una cadena de wchar_t asignada con new[] es usar delete[].

wchar_t *hs = new wchar_t[20]; 
... 
delete[] hs; 

La forma correcta para liberar a un BSTR es con SysFreeString():

BSTR bs = SysAllocString(hs); 
... 
SysFreeString(bs); 

Mientras que eres nuevo en BSTR, debe leer Eric's Complete Guide to BSTR Semantics.

3

The docs for SysAllocString() son bastante claras:

Esta función asigna una nueva cadena y copia la cadena que se pasa en ella.

los datos de cadena que se pasa en se copia - SysAllocString() no la usa después de que haya terminado - usted es libre de cancelar la asignación o modificar ese búfer.

0

Convertir wchar_t* a OLECHAR* es necesario utilizar W2OLE macro:

wchar_t *hs = new wchar_t[20]; 
USES_CONVERSION; 
BSTR bs = SysAllocString(W2OLE(hs)); 
delete[] hs; // no need in hs anymore since SysAllocString allocates memory 
... 

SysFreeString(bs); // delete Sys string 
Cuestiones relacionadas