¿Cómo puedo hacer una función para borrar una cadena C y/o liberar la memoria asignada? ¿Por qué el código siguiente no funciona?
void freeStr(char** str) {
free(*str);
}
int main() {
char* str = "some string";
freeStr(&str);
printf("%s", str);
return 0;
}
- Sólo puede utilizar free() sobre indicadores que se usa malloc() antes.
- dicho esto, el valor del puntero debe ser suficiente… no se necesita un puntero a un puntero. Usted no puede modificar de forma segura los datos de un literal de cadena, desde su
const char[]
, y usted también no debefree
ya que nomalloc
él… ni siquiera en el montón. - Siéntase libre de upvote y/o aceptar las respuestas que he encontrado muy útil.
- Usted dice, yo debería de uso libre(str) en lugar de(*str) en función de freeStr(), derecho?
Puede ni libres ni borrar la memoria de la matriz en la que un literal de cadena indica.
Sin embargo, a perder el acceso a ella, todo lo que necesita es cambiar el puntero que ha almacenado su dirección en:
Usted podría encontrar que es útil para ir a las C FAQ – malloc sección.
Como otros han señalado, no puede liberar o modificar los literales de cadena ya que se suelen colocar en leer sólo las secciones de la memoria. Sin embargo, si desea borrar y
free()
memoria asignada dinámicamente, tendría que hacer algo como lo siguiente:*str = NULL;
? ¿por qué utilizarfree( *str );
solo es no borrar la memoria(ya que estamos desasignar la memoria)? Por qué somos capaces de obtener la cadena de los contenidos de la memoria que ya está liberado o eliminado? Puede usted por favor explique en detalle?La cadena asignada en el CONST_DATA sección (no se puede modificar) y, por lo tanto, usted no llamada gratuita en él.
Que parte de la memoria se asigna en tiempo de compilación y es de sólo lectura. Que parte de la memoria aún mantiene
"some string\0"
La CONST_DATA sección, en la asamblea es como los datos del segmento (DS), que contiene global y estático (sólo lectura) variables inicializadas en el momento de la compilación en sí. Que no cambio durante el tiempo de ejecución, y siendo asignado a la ejecución del programa.
CONST_DATA
sección de todos modos.Las respuestas son muy buenas, pero hay algunos puntos que se han perdido o se omite.
Tu pregunta es un poco vaga.
Si quieres borrar una cadena C sobrescribir el espacio de memoria que apunta con bytes nulos. Usted sólo puede
free()
una cadena C que ha sido asignado por el asignador de montón de a través de una llamada a uno de los asignador de montón de funciones tales comomalloc()
,calloc()
orealloc()
etc.Así que si usted asigna una cadena con
malloc()
, o uno de los otros del montón de asignación de funciones, como y, a continuación, copiar una cadena de caracteres en, usted podría borrar por llamarmemset()
, pero aún así, usted entonces tiene que llamarfree()
de liberar la memoria el montón.Por ejemplo:
También, tenga en cuenta que C utiliza el ámbito de bloque y no tiene explícitamente desasignar las matrices que fueron declaradas con el almacenamiento predeterminado de la clase, auto, ya que se desprendió del marco de pila cuando ese bloque sale del ámbito.
Por último, otro método de asignación es estático. Cuando utilice la declaración:
El espacio para la cadena «cadena literal» reside en un asignados estáticamente segmento que nunca debe ser escrito. En algunas plataformas, obtendrá una violación de segmento si intenta escribir a ese segmento de la memoria. Usted no debe tratar de borrar los bloques de memoria que se asignan estáticamente como no hay ninguna garantía de que el segmento de las que están asignadas en se puede escribir.
http://en.cppreference.com/w/c/memory/free
void free( void* ptr );
Desasigna el espacio previamente asignado por malloc(), calloc() o realloc(). Si ptr es apuntador null, la función no hace nada.
Su cadena no está asignada con cualquiera de estas funciones. Creo que es de esta manera.
delete
si no usonew
y usted no puede usarfree
si no usomalloc
,calloc
,realloc