2009-02-18 18 views
17

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.CString a char *

Sin embargo, últimamente nos hemos preocupado acerca de cómo funciona esto, y si hay una mejor manera de hacerlo.

La forma en que lo entiendo para funcionar es que pasa un puntero a la función que apunta al primer carácter en el CString y todo funciona bien.

I Supongo que solo nos preocupan las pérdidas de memoria o cualquier circunstancia imprevista en la que no sea una buena idea.

Respuesta

24

Si sus funciones sólo requieren la lectura de la cadena y no modificarlo, cambiar a aceptar const char * en lugar de char *. El CString se convertirá automáticamente, así es como funcionan la mayoría de las funciones de MFC y es realmente útil. (En realidad, MFC usa LPCTSTR, que es un 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 ha sido mencionado por otros, debe utilizar ReleaseBuffer después de GetBuffer. No necesita hacer eso para la conversión a const char *.

+0

He trid el strtol() y no convierte automáticamente de CString a const char *. ¿Cómo haces eso? También probé el tipo elenco, tampoco funciona. – henryyao

+0

@henryyao usa '_tcstol' en su lugar. –

+0

¡¡Funciona perfecto !!! – henryyao

3

cuando llama a la función getbuffer le asigna memoria. cuando se han hecho con él, tiene que llamar ReleaseBuffer desasignar que

8

@ OP: >>> supongo que son sólo preocupado por las pérdidas de memoria o cualquier ...

Hola, llamando al método GetBuffer no dará lugar a ningún pérdidas 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 afirmación no es del todo 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.

Cheers, Rajesh. MVP, Visual ++.