unique_ptr pointer new c++ memory

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 que char* = 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:

  1. malloc / free
  2. calloc / free
  3. new / delete
  4. 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 puedes free de ninguna manera.
  • char *sn = new char[4]; proviene de la salida del operator new[] . Entonces deberías liberarlo cuando puedas.