new - pointer c++
¿Hay una necesidad de destruir char*= "string" o char*= new char[6]? (8)
Supongo que char* = "string"
es lo mismo que char* = new char[6]
. Creo que estas cadenas se crean en el montón en lugar de la pila. Entonces, ¿necesito destruirlos o liberar su memoria cuando termine de usarlos o los destruyan ellos solos?
Supongo que cuando hago
char* = "string"
es lo mismo quechar* = new char[6]
.
No. Lo primero que hace es crear una constante. Modificarlo es un comportamiento indefinido. Pero para responder a tu pregunta; no, no tienes que destruirlos. Y solo una nota, siempre use std::string
siempre que sea posible.
El nombre del juego es "destruir solo lo que creaste". Aquí están los pares:
-
malloc
/free
-
calloc
/free
-
new
/delete
-
new []
/delete []
Desde que creaste la segunda cadena usando new []
, tienes la responsabilidad de destruirla con delete []
. Llame a delete [] string2
cuando haya terminado.
Ahora bien, si su código es lo suficientemente intrincado y hace que sea difícil hacer un seguimiento de las eliminaciones, considere el uso de punteros de alcance o punteros automáticos. La clase boost::scoped_ptr
de la biblioteca de boost es un buen lugar para comenzar. También busque en el idioma RAII , bastante útil y útil.
Ellos no son lo mismo. Su primer ejemplo es una cadena constante, por lo que definitivamente no se asigna desde el montón. Su segundo ejemplo es una asignación de memoria de tiempo de ejecución de 6 caracteres, y eso proviene del montón. No desea eliminar su primer ejemplo, pero debe delete []
su segundo ejemplo.
No sabe dónde se almacenan los literales de cadena. Incluso puede ser memoria de solo lectura, por lo que su código debería leer:
const char* c = "string";
Y una nueva matriz de caracteres debe eliminarse como cualquier otra área de memoria asignada dinámicamente.
No. Cuando 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];
Solo en este último caso está asignando memoria en el montón. Entonces llamarías a eliminar cuando hayas terminado.
No. Solo necesita liberar cadenas manualmente cuando asigna manualmente la memoria usando la función malloc
(en C) o el new
operador (en C ++). Si no utiliza malloc
o new
, entonces el char*
o cadena se creará en la pila o como una constante de tiempo de compilación.
nuevo siempre es una asignación, mientras que la definición de una cadena en línea realmente integra 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 puedesfree
de ninguna manera. -
char *sn = new char[4];
proviene de la salida deloperator new[]
. Entonces deberías liberarlo cuando puedas.