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?¿Hay una necesidad de destruir char * = "string" o char * = new char [6]?
Respuesta
No. Solo necesita liberar cadenas manualmente cuando asigne manualmente la memoria mediante la función malloc
(en C) o el operador new
(en C++). Si no usa malloc
o new
, se creará char*
o una cadena en la pila o como una constante de tiempo de compilación.
No sabe dónde se almacenan los literales de cadena. Incluso puede ser la memoria de sólo lectura, por lo que su código debe decir:
const char* c = "string";
Y una nueva matriz carbón debe ser eliminar d al igual que cualquier otra área de memoria asignada dinámicamente.
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 necesita delete []
, su segundo ejemplo.
Supongo que cuando hago
char* = "string"
es lo mismo quechar* = 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, siempre use std::string
siempre que sea posible.
nuevo es siempre una asignación, mientras que la definición de una cadena en línea realmente integra los datos en el programa 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
No. Cuando usted dice:
const char* c = "Hello World!";
está asignando c para una constante de cadena "preexistente", que no es lo mismo que:
char* c = new char[6];
Sólo en el este último caso está asignando memoria en el montón. Entonces llamarías a eliminar cuando hayas terminado.
El nombre del juego es "destruir solo lo que has creado".Aquí están las parejas:
malloc
/free
calloc
/free
new
/delete
new []
/delete []
Desde que creó la segunda cadena utilizando new []
, la responsabilidad está en ti para destruirlo con delete []
. Llame al delete [] string2
cuando haya terminado.
Ahora, si su código es lo suficientemente intrincado y hace que sea difícil hacer un seguimiento de las eliminaciones, tenga en cuenta el uso de punteros de ámbito o punteros automáticos. La clase boost::scoped_ptr
de la biblioteca de impulso es un buen lugar para comenzar. También busque en el idioma RAII, bastante útil y útil.
Vamos a ver lo que 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];
viene de la salidaoperator new[]
. Entonces deberías liberarlo cuando puedas.
- 1. String.Replace (char, char) o Replace (string, string)?
- 2. ¿Qué tiene más sentido: char * string o char * string?
- 3. char! = (Char firmado), char! = (Char no firmado)
- 4. Diferencia entre char * str = "STRING" y char str [] = "STRING"?
- 5. std :: string vs. char *
- 6. Char Matriz VS Char *
- 7. String to Char array Java
- 8. C char a string (pasando char a strcat())
- 9. Necesita convertir String^en char *
- 10. char * foo vs char * foo
- 11. Conversión implícita de char ** a const char **
- 12. C Convertir char en char *
- 13. C++ de unsigned char * a const char *
- 14. C++ convertir char a const char *
- 15. C - fundición int a char y anexar char a char
- 16. Método String.Replace (char, char) en C#
- 17. Reemplazar números de char después de un char específico
- 18. varchar2 (n BYTE | CHAR) por defecto -> CHAR o BYTE
- 19. char * vs char ** como parámetros a una función en C
- 20. inicializar std :: string de char * sin copia
- 21. Asignación de memoria char * y char []
- 22. const char * miVar vs const char miVar []
- 23. Diferencia entre char y char [1]
- 24. En Java, ¿cómo se convierte una Cadena en un char o un char en una Cadena?
- 25. stl map <char*,char*> destructor
- 26. casting char [] [] a char ** provoca segfault?
- 27. Conversión de System :: String a Const Char *
- 28. Diferencia entre char * y char [] en C
- 29. C++ - char ** argv vs char * argv []
- 30. stringstream, string y char * confusión de conversión
"nuevo" asigna memoria del montón, nunca de la pila. (A menos que, por supuesto, haya anulado el nuevo operador.) –
Mi mal. Lo sabía. De Verdad. :-) – Andrew
Luego amablemente editar;) – FordFulkerson