Pregunta

yo asumo eso char* = "string" es lo mismo que char* = new char[6].Creo que estas cadenas se crean en el montón en lugar de en la pila.Entonces, ¿tengo que destruirlos o liberar su memoria cuando termine de usarlos o se destruyen solos?

¿Fue útil?

Solución

No.Solo necesita liberar cadenas manualmente cuando asigna manualmente la memoria usted mismo usando el malloc función (en C) o la new operador (en C++).Si no usas malloc o new, entonces el char* o cadena se creará en la pila o como una constante de tiempo de compilación.

Otros consejos

No.Cuando tu dices:

const char* c = "Hello World!";

Está asignando c a una constante de cadena "preexistente" que NO es lo mismo que:

char* c = new char[6];

Sólo en el último caso se asigna memoria en el montón.Entonces llamarías a eliminar cuando hayas terminado.

Asumo cuando lo hago char* = "string" es lo mismo que char* = new char[6].

No.Lo que hace el primero es crear una constante.Modificarlo es un comportamiento indefinido.Pero para responder a tu pregunta;no, no tienes que destruirlos.Y solo una nota, usa siempre std::string cuando sea posible.

El nombre del juego es "destruye sólo lo que creaste".Aquí están las parejas:

  1. malloc/free
  2. calloc/free
  3. new/delete
  4. new []/delete []

Desde que creaste la segunda cadena usando new [], la responsabilidad de destruirlo recae en usted delete [].Llamar delete [] string2 Cuando acabes.

Ahora bien, si su código es lo suficientemente complicado y dificulta el seguimiento de las eliminaciones, considere el uso de punteros con alcance o punteros automáticos.El boost::scoped_ptr La clase de la biblioteca Boost es un buen lugar para comenzar.Mire también el RAII modismo, cosas bastante prácticas y útiles.

No son lo mismo.Su primer ejemplo es una cadena constante, por lo que definitivamente no está asignada del montón.Su segundo ejemplo es una asignación de memoria en tiempo de ejecución de 6 caracteres, y eso proviene del montón.No deseas eliminar tu primer ejemplo, pero debes delete [] Tu segundo ejemplo.

No sabes dónde se almacenan los literales de cadena.Incluso puede ser memoria de sólo lectura, por lo que tu código debería leer:

const char* c = "string";

y un nuevo la matriz de caracteres debe ser borrard como cualquier otra área de memoria asignada dinámicamente.

new es siempre una asignación, mientras que definir una cadena en línea en realidad incrusta los datos en el programa mismo y no se puede cambiar (algunos compiladores lo permiten mediante un truco inteligente, no se moleste).

Algunos compiladores escriben cadenas en línea para que no pueda modificar el búfer.

char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted

Veamos qué hace GCC 4.8 x86-64 Linux

Programa:

#include <cstdio>
int main() {
    const char *s = "abc";
    char *sn = new char[4];
    sn[3] = '\0';
    std::printf("%s\n", s);
    std::printf("%s\n", sn);
}

Compilar y descompilar:

g++ -ggdb -std=c++98 a.cpp
objdump -CSr a.o

La salida contiene:

  const char *s = "abc";
 8:   48 c7 45 f0 00 00 00    movq   $0x0,-0x10(%rbp)
 f:   00 
                     c: R_X86_64_32S .rodata
  char *sn = new char[4];
10:   bf 04 00 00 00          mov    $0x4,%edi
15:   e8 00 00 00 00          callq  1a <main+0x1a>
                        16: R_X86_64_PC32       operator new[](unsigned long)-0x4
1a:   48 89 45 f8             mov    %rax,-0x8(%rbp)

Interpretación:

  • char *s = "abc" entra en .rodata.Entonces no puedes free de ninguna manera.
  • char *sn = new char[4]; proviene de la salida de operator new[].Entonces deberías liberarlo cuando puedas.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top