c++ - que - CString a char*
strcpy (4)
cuando llama a la función getbuffer, asigna memoria para usted. cuando haya terminado con esto, necesita llamar a releasebuffer para desasignarlo
Estamos utilizando la clase CString en la mayor parte de nuestro código. Sin embargo, a veces tenemos que convertir a un char *. en este momento hemos estado haciendo esto usando variable.GetBuffer (0) y esto parece funcionar (esto ocurre principalmente al pasar el Csting a una función donde la función requiere un char *). La función acepta esto y seguimos adelante.
Sin embargo, últimamente nos hemos preocupado acerca de cómo funciona esto y si existe una mejor manera de hacerlo.
La forma en que lo entiendo para funcionar es que pasa un puntero de char en la función que apunta al primer carácter en el CString y todo funciona bien.
Creo que solo nos preocupan las filtraciones de memoria o cualquier circunstancia imprevista en la que no sea una buena idea.
prueba la documentación en http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx para obtener ayuda sobre eso.
Si sus funciones solo requieren leer la cadena y no modificarla, cámbielas para aceptar const char *
lugar de char *
. El CString
se convertirá automáticamente para usted, así es como funcionan la mayoría de las funciones de MFC y es realmente útil. (En realidad, MFC usa LPCTSTR
, que es sinónimo de const TCHAR *
- funciona tanto para compilaciones MBC como Unicode).
Si necesita modificar la cadena, GetBuffer(0)
es muy peligroso; no asignará necesariamente suficiente memoria para la cadena resultante, y podría obtener algunos errores de desbordamiento del búfer.
Como han mencionado otros, debe utilizar ReleaseBuffer
después de GetBuffer
. No necesita hacer eso para la conversión a const char *
.
@ OP: >>> Creo que estamos preocupados por fugas de memoria o cualquier ...
Hola, llamar al método GetBuffer no provocará ninguna pérdida de memoria. Porque el destructor va a desasignar el búfer de todos modos. Sin embargo, otros ya lo han advertido sobre los posibles problemas al llamar a este método.
@Can >>> cuando llama a la función getbuffer le asigna memoria.
Esta declaración no es completamente verdad. GetBuffer (0) NO asigna memoria. Simplemente devuelve un puntero al búfer de cadena interno que se puede utilizar para manipular la cadena directamente desde "fuera" de la clase CString.
Sin embargo, si pasa un número, diga N como GetBuffer (N), y si N es mayor que la longitud actual del búfer, entonces la función asegura que el búfer devuelto sea al menos tan grande como N asignando más memoria .
Saludos, Rajesh. MVP, Visual ++.