EDITAR: Sé que en este caso, si fuera una clase real, sería mejor no poner la cadena en el montón. Sin embargo, esto es solo un código de muestra para asegurarme de que entiendo la teoría. El código real va a ser un árbol negro rojo, con todos los nodos almacenados en el montón.Forma correcta de reasignar punteros en C++
Quiero asegurarme de que tengo estas ideas básicas correctas antes de continuar (procedo de un fondo de Java/Python). He estado buscando en la red, pero aún no he encontrado una respuesta concreta a esta pregunta.
Cuando reasigna un puntero a un nuevo objeto, ¿tiene que llamar a eliminar primero en el objeto viejo para evitar una pérdida de memoria? Mi intuición me dice que sí, pero quiero una respuesta concreta antes de seguir adelante.
Por ejemplo, vamos a decir que tenía una clase que almacena un puntero a una cadena
class MyClass
{
private:
std::string *str;
public:
MyClass (const std::string &_str)
{
str=new std::string(_str);
}
void ChangeString(const std::string &_str)
{
// I am wondering if this is correct?
delete str;
str = new std::string(_str)
/*
* or could you simply do it like:
* str = _str;
*/
}
....
En el método changeString, lo que sería correcto?
Creo que me estoy colgando si no usa la nueva palabra clave para la segunda forma, todavía se compilará y ejecutará como esperaba. ¿Esto simplemente sobrescribe los datos a los que apunta este puntero? ¿O hace algo más?
Cualquier consejo sería enormemente appricated: D
Es muy probable que no se deba asignar una cadena con 'new' en primer lugar. ¿Tienes alguna razón específica para eso? – UncleBens
Lea la edición en la parte superior de la página – vimalloc
Una cosa más natural que hacer aquí, sería: '* str = _str;' (no es necesario tirar una cadena y crear otra si solo quiere asignar el contenido) – UncleBens