2010-02-26 12 views

Respuesta

7

No estoy seguro de que esto cause una pérdida de memoria, pero debe llamar a ReleaseBuffer para asegurarse de que los miembros privados de CString estén actualizados. Por ejemplo, ReleaseBuffer actualizará el campo de longitud de la CString buscando el carácter nulo de terminación.

+1

@ Nick, gracias. Acabo de escribir un pequeño programa para probar ReleaseBuffer(), ¡tienes razón! ¡Gracias! – Landy

3

¿Qué sucederá si no utilizo ReleaseBuffer después de GetBuffer()?

No he utilizado MFC (y espero que no tendrá nunca tocarlo con un palo de diez pies) pero, como regla general, cada vez que tenga un API que tiene tanto GetXXX() y ReleaseXXX() (especialmente cuando el resultado de GetXXX() convenientemente es del tipo que toma ReleaseXXX()) - entonces, cuando se olvida de llamar al ReleaseXXX() para cada una de sus llamadas a GetXXX(), perderá un XXX.

+0

@sbi, gracias. De esta publicación - http://stackoverflow.com/questions/559483/cstring-to-char, "llamar al método GetBuffer no provocará ninguna pérdida de memoria. Porque el destructor va a desasignar el búfer de todos modos." – Landy

+2

+ 1 para una regla general fabulosa. –

+0

@Landy: Bueno, ahí tienes. Entonces, en este caso, la regla de oro parece fallar. Supongo que es por eso que se llama una "regla de oro", después de todo, ¿no? Bueno, ¿dije que no me gusta el MFC? Ahora hay una razón más para hacerlo. Una API donde 'GetXXX()' y 'ReleaseXXX()' no vienen en pares simplemente apesta ... De todos modos, desde http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx: " Después de modificar el contenido de un objeto CString directamente, debe llamar a ReleaseBuffer antes de llamar a cualquier otra función de miembro de CString ". – sbi

0

Aquí hay un ejemplo de cómo solía CString :: GetBuffer() y CString :: ReleaseBuffer():

LPTSTR pUnitBuffer = pAPBElement->m_strUnits.GetBuffer(APB_UNIT_SIZE); 
if (pUnitBuffer != "") 
{ 
    if (strncmp(pAPBElement->m_strUnits, (char*)pszBuffer[nLoop - nFirst], APB_UNIT_SIZE) != 0) 
    {  
    LPTSTR pUnitOriginal = pAPBElement->m_strOriginal.GetBuffer(APB_UNIT_SIZE); 

    strncpy(pUnitBuffer, 
      (char*)&pszBuffer[nLoop - nFirst], 
      APB_UNIT_SIZE); 

     strncpy(pUnitOriginal, 
      (char*)&pszBuffer[nLoop - nFirst], 
      APB_UNIT_SIZE); 

    pAPBElement->m_strOriginal.ReleaseBuffer(); 
    } 
} 
pAPBElement->m_strUnits.ReleaseBuffer(); 
Cuestiones relacionadas