usar strings resueltos nombres leer ejercicios como caracteres cadenas cadena arreglo almacenar c++ memory-management

strings - ejercicios resueltos de cadenas en c++



Eliminar una matriz de caracteres (6)

Como han dicho otros, el código que has publicado es perfectamente válido y no debería causar ningún problema.

El error podría haber sido causado por cambiar el valor de p en algún punto intermedio.

Esta pregunta está relacionada con esta . Dado este código:

char *p = new char[200]; delete[] p;

¿Qué pasaría si configuras p[100] = ''/0'' antes de eliminar p?

Tuve un código donde obtuve un error de depuración cuando intenté eliminar una matriz de caracteres no terminada en nulo, algo sobre la eliminación de la memoria del montón que no está asignada. Parecía eliminar la memoria fuera de los límites de la matriz.


Creo que estás confundiendo una matriz de caracteres antigua con una matriz de caracteres que representa una cadena de estilo C. El operador de eliminación de C ++ no se preocupa por una matriz de cadenas de estilo C. Todo lo que verás es una serie de caracteres. Realmente no es diferente a decir eliminar una matriz de int.

La presencia o ausencia del terminador nulo solo es relevante en las funciones que tratan a un char* como una cadena de estilo C.


El código:

char *p = new char[200]; p[100] = ''/0''; delete[] p;

Es perfectamente válido C ++. eliminar no sabe ni se preocupa por las cadenas terminadas en nulo, por lo que su error debe haber tenido alguna otra causa.


Esto debería funcionar bien, por lo que puedo decir. Asigna una porción de memoria, y el sistema operativo debe realizar un seguimiento de ella, y ser capaz de desasignarla cuando se le solicite. No debería importar en absoluto qué valores pones en el búfer que has asignado.

Pegar un NULL en medio de una matriz de caracteres ciertamente interferiría con las funciones de la cadena C, como strcmp , strlen , etc., pero eso es otra cuestión completamente.


Nada especial pasaría. Escribiría en algún lugar en el medio de la memoria asignada (100 bytes aparte del inicio, 99 bytes antes del final de la memoria asignada).

Entonces liberarías esa memoria asignada. El compilador lo manejará exactamente como lo esperaríamos. La memoria asignada por eso no tiene ninguna relación con las cadenas terminadas en nulo. Podrías meter todo lo que quieras en esa memoria. Es un fragmento de almacenamiento "en bruto", incluso podría crear algún objeto C ++ arbitrario en esa memoria (ubicación nueva).

Tu error está en otra parte. Por ejemplo, un error común es este, donde se llama al constructor una vez, pero al destructor se le llama dos veces, borrando dos veces algo:

struct A { P *p; A() { p = new P; } ~A() { delete p; } }; A getA() { return A(); } int main() { A a = getA(); }

Ahora, lo que sucede es que el constructor predeterminado se llama una vez, y el objeto creado se copia cero o más veces. Pero el destructor se ejecuta para cada copia que se crea. Por lo tanto, llamará al destructor en el puntero más de una vez, lo que dará lugar a errores tan extraños. La forma correcta de solucionarlo es usar un puntero inteligente, como shared_ptr . Como ejercicio, también puede hacerlo sin hacerlo, escribiendo los constructores de copia adecuados que copian el objeto y asignan memoria en el constructor de copia, de modo que la copia y el objeto original respectivo mantengan punteros distintos.


No debería importar. delete [] se debe utilizar para eliminar una matriz asignada dinámicamente independientemente de su contenido.