¿Cuál es la mejor manera de eliminar una cadena estándar de la memoria asignada en el montón cuando termino de usarla? ¡Gracias!Cómo liberar correctamente una cadena estándar :: de la memoria
Respuesta
std::string
es solo una clase normal , por lo que se aplican las reglas habituales.
Si asigna std::string
objetos en la pila, como globales, como miembros de la clase, ... no necesita hacer nada especial, cuando salen del alcance se llama a su destructor, y se encarga de liberar la memoria utilizada para la cadena de forma automática.
int MyUselessFunction()
{
std::string mystring="Just a string.";
// ...
return 42;
// no need to do anything, mystring goes out of scope and everything is cleaned up automatically
}
El único caso en el que usted tiene que hacer algo es cuando se asigna un std::string
en el montón usando el operador new
; en ese caso, como con cualquier objeto asignado con new
, debe llamar al delete
para liberarlo.
int MyUselessFunction()
{
// for some reason you feel the need to allocate that string on the heap
std::string * mystring= new std::string("Just a string.");
// ...
// deallocate it - notice that in the real world you'd use a smart pointer
delete mystring;
return 42;
}
Como implicado en el ejemplo, en general no tiene sentido asignar un std::string
en el montón, y, cuando se necesita que, aún debe encapsular como puntero en un puntero inteligente para evitar aún a riesgo de pérdidas de memoria (en caso de excepciones, rutas de retorno múltiples, ...).
En realidad
std::string
se define comonamespace std { typedef std::basic_string<char> string; };
por lo que es sinónimo de la creación de instancias de la clase
basic_string
plantilla para caracteres de tipochar
(esto no cambia nada en la respuesta, pero en SO usted debe ser pedante incluso en preguntas de novatos).
y aquí estaba pensando que std :: string era un typedef para la clase de plantilla std :: basic_string con un tipo de elemento char, en lugar de ser una clase normal. No es que ser un typedef para una clase de plantilla (o ser una estructura o ser un tipo primitivo) haga la diferencia a la destrucción y desasignación de objetos automáticos y dinámicos. –
@ Pete: corregir, agregar aclaración. –
@Matteo, todavía está mal. No es una especialización, es una instanciación. Y es especialmente importante ser pedante en las preguntas de los novatos porque, de lo contrario, los novatos elegirían fácilmente los términos equivocados. No me podría importar menos si se trata de una especialización o creación de instancias, pero un novato podría pensar "specialization == typedef", que parece razonable, pero es completamente erróneo. –
Usa delete
si está en el montón, y nada si está en la pila.
std::string foo("since it's on the stack, it will auto delete out of scope");
o:
std::string* foo = new std::string("allocated on the heap needs explicit destruction")
delete foo;
void foo() {
string* myString = new string("heap-allocated objects are deleted on 'delete myString;'");
cout << *myString << endl;
delete myString;
}
o mejor aún, evitar punteros cuando sea posible y utilizar variables automáticas:
void foo() {
string myString("stack-allocated string is automatically deleted when myString goes out of scope");
cout << myString << endl;
}
simplemente tratan std :: string como cualquier tipo básico
std::string *str = new std::string("whatever");
///code
delete str;
- 1. Cómo liberar correctamente una sesión AVCaptureSession
- 2. ¿Cómo liberar memoria?
- 3. Cómo liberar() un malloc() 'd estructurado correctamente?
- 4. NewStringUTF() y liberar memoria
- 5. ¿Cómo liberar memoria en PHP?
- 6. Cómo liberar memoria en Perl?
- 7. importancia de liberar memoria?
- 8. Cómo liberar la capacidad no utilizada de una cadena
- 9. Liberar memoria dos veces
- 10. ¿Cómo liberar memoria de std :: deque?
- 11. Liberar memoria asignada en una DLL diferente
- 12. ¿Cómo puedo liberar memoria explícitamente en Python?
- 13. "JScript - script block" y pérdidas de memoria - ¿Cómo liberar recursos correctamente?
- 14. Cómo liberar memoria cuando se produce una excepción fuera de la memoria en Delphi usando SetLength
- 15. ¿Cómo puedo liberar memoria en C?
- 16. ¿Cómo liberar una interfaz?
- 17. ¿Cómo puedo liberar memoria obtenida por sbrk()?
- 18. liberar memoria explícitamente en C#
- 19. Liberar memoria asignada con newCString
- 20. no se puede liberar la memoria
- 21. cómo liberar memoria usada inmediatamente en la lista de Python?
- 22. ¿Cómo liberar memoria asignada usando mmap?
- 23. ¿Cómo liberar memoria previamente asignada cuando ocurrieron errores?
- 24. Cómo salir de una aplicación correctamente
- 25. Los errores Matplotlib provocan una pérdida de memoria. ¿Cómo puedo liberar esa memoria?
- 26. ¿Es esta una buena manera de liberar memoria?
- 27. ¿Cuándo liberar memoria en una extensión de PHP?
- 28. ¿Cómo declarar una cadena json correctamente?
- 29. ¿Cómo manejar una cadena enorme correctamente?
- 30. aplicación Android no liberar Bluetooth correctamente en la salida
De la misma forma que para cualquier otro objeto. Realmente, ¿podrías aclarar tu pregunta? ¿Qué estás haciendo, qué intentas lograr, qué intentaste y cómo no funcionó? –
¿Puedes ampliar tu pregunta? ¿En qué contexto? – vz0
¿Por qué el voto a favor? Parece una pregunta perfectamente razonable que alguien nuevo en C++ haría. IMO el mundo necesita más programadores que quieran saber cómo limpiarse ellos mismos =) –