De CString to char*, ReleaseBuffer() se debe utilizar después de GetBuffer(). ¿Pero por qué? ¿Qué pasará si no uso ReleaseBuffer después de GetBuffer()? ¿Alguien puede mostrarme un ejemplo? Gracias.¿Qué sucede si no llamo a ReleaseBuffer después de GetBuffer?
Respuesta
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.
¿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
.
@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
+ 1 para una regla general fabulosa. –
@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
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();
- 1. ¿Qué sucede si llamo a jQuery.post() con una url vacía?
- 2. ¿Qué sucede si llamo a GlobalLock() y luego no puedo llamar a GlobalUnlock()?
- 3. ¿Qué sucede si llamo a ParamByName para un parámetro que no existe?
- 4. ¿Qué sucede si no especifico targetFramework = "4.0"?
- 5. ¿Qué sucede si nunca llamas a Socket.EndConnect?
- 6. ¿Qué sucede después de capturar un paquete?
- 7. ¿Qué sucede si lanzo ReleaseMutex() dos veces?
- 8. ¿Qué le sucede a AsyncTasks después de onPause?
- 9. ¿Qué sucede si configuro HttpGetEnabled = false
- 10. En Akka, ¿qué sucede si veo() un ActorRef muerto?
- 11. ¿Qué sucede cuando llamo a una función de Javascript que toma parámetros, sin proporcionar esos parámetros?
- 12. Python's random: ¿Qué sucede si no uso seed (someValue)?
- 13. ¿Qué sucede si no devuelve un valor en C++?
- 14. ¿Qué sucede si no revierte una transacción en Hibernate?
- 15. ¿Qué sucede si main() no devuelve un valor int?
- 16. ¿Qué sucede si las cookies están deshabilitadas?
- 17. ¿Qué sucede si asigna un valor a $ _REQUEST?
- 18. Java: openGL: JOGL: ¿Qué sucede detrás de las escenas cuando llamo al método display()?
- 19. ¿Qué sucede con la memoria después de free()?
- 20. ¿Qué sucede si no comprometes una transacción a una base de datos (por ejemplo, SQL Server)?
- 21. log4net a SQLServer: ¿qué sucede si la base de datos no está disponible?
- 22. ¿Qué sucede si un servicio se inicia varias veces?
- 23. ¿Qué sucede con el atributo view.frame.size después de CGAffineTransform (Rotate)?
- 24. ASP.NET: ¿Qué sucede con el código después de Response.Redirect (...)?
- 25. ¿Qué sucede si un bloque finally arroja una excepción?
- 26. ¿Qué sucede cuando las conexiones a MongoDB no están cerradas?
- 27. ¿Qué sucede si deseo implementar una consulta complicada en REST
- 28. ¿Qué sucede si falla el constructor de shared_ptr?
- 29. ¿Qué sucede con los punteros a la memoria asignada dinámicamente después de una horquilla UNIX?
- 30. Qué sucede con los espacios de trabajo existentes después de actualizar a TFS 2010
@ Nick, gracias. Acabo de escribir un pequeño programa para probar ReleaseBuffer(), ¡tienes razón! ¡Gracias! – Landy