Categorías > Lenguajes > C++ > Duda con memoria dinamica en clases ...
Nuevo Mensaje | Responder
Sawyer


62 envíos
Desconectado
1767 lecturas
7 respuestas
Duda con memoria dinamica en clases18-03-2010 a las 15:41:49

La verdad no recuerdo si esto era por crear una clase o cuando uno usaba lo que es la herencia en las clases, pero en fin, mi duda es la siguiente. Cada vez que yo creo una clase (o heredo una clase, segun cual era el que pasaba que no recuerdo), y que dentro de sus variables miembros ocupo memoria dinamica, debo definir siempre el copy constructor??, porque segun tengo entendido si no se define se da uno predeterminado el cual hace que cree una nueva variable con memoria dinamica (llamemosla X) que apunta a la misma direccion que la anterior y que despues se borra por lo que deja nuestra variable original si destino. Algo asi tengo entendido yo que es, a ver si alguien me lo explica.

"Las mejores cosas ocurren, cuando menos las esperamos"
Responder | Citar | Moderar | Mensaje Privado
Training Channel
Sorancio


307 envíos
Desconectado

#1
RE: Duda con memoria dinamica en clases18-03-2010 a las 16:01:47

Pues C++ no puede (aunque esto depende de la implementación) crear memoria dinámica que no ha sido programada. El constructor copia lo que hará es copiar el valor de tal variable, si es un puntero, copiará la dirección de memoria.

Si no implementas el constructor copia, declaralo como privado, para que no pueda usarse y evitar problemas de este tipo.


Responder | Citar | Moderar | Mensaje Privado
Sawyer


62 envíos
Desconectado

#2
RE: Duda con memoria dinamica en clases18-03-2010 a las 19:10:43

No entiendo a lo que te refieres con que no puede crear memoria dinamica no programada. Y como es eso de declararlo privado?

"Las mejores cosas ocurren, cuando menos las esperamos"
Responder | Citar | Moderar | Mensaje Privado
Sorancio


307 envíos
Desconectado

#3
RE: Duda con memoria dinamica en clases19-03-2010 a las 08:56:57

Pues esto ya es teoría de C++. En las clases y estructuras de C++ hay tres ámbitos: público, protegido y privado. De estos tres, quedate con el primero y el último pues son los más útiles desde mi punto de vista.

En fin, declarar algo como privado significa que está dentro del ámbito privado, sólo se puede acceder a él a través de una clase amiga o de miembros públicos. Para definir el ámbito privado se usa el selector private.

Código Fuente:private:
  // ámbito privado


En una clase este es el ámbito por defecto, en una estructura por defecto es público.

Ahora, algo no programado es algo que tú no has escrito. C++ no puede pedir memoria dinámica al no ser que esté explícitamente el operador new o se use la función de C malloc. Por lo que el operador copia, por defecto, no pedirá memoria dinámica.


Responder | Citar | Moderar | Mensaje Privado
Sawyer


62 envíos
Desconectado

#4
RE: Duda con memoria dinamica en clases19-03-2010 a las 18:25:50

Entiendo, pero la pregunta es si yo pido memoria dinamica, debo definir el constructor copia?

"Las mejores cosas ocurren, cuando menos las esperamos"
Responder | Citar | Moderar | Mensaje Privado
Sorancio


307 envíos
Desconectado

#5
RE: Duda con memoria dinamica en clases19-03-2010 a las 18:43:25

No es obligatorio definir ningún constructor (siempre y cuando nunca lo utilices claro). Depende de lo que quieras que haga el constructor copia, si deberás implementar que pida memoria dinámica.


Responder | Citar | Moderar | Mensaje Privado
realloc


55 envíos
Desconectado

#6
RE: RE: Duda con memoria dinamica en clases22-03-2010 a las 14:24:08

Citando a SawyerEntiendo, pero la pregunta es si yo pido memoria dinamica, debo definir el constructor copia?


Respondiendo a esta pregunta, ligando con tu primer post y metiéndome donde no me llaman XD Tenemos dos cosas: por un lado (1) el paradigma orientado a objetos, por el otro (2) el compilador C++

(1) En cuando a la POO, existe el concepto de "Clase canónica". Una clase canónica es aquella que define al menos los siguientes elementos: Un constructor (el constructor por defecto), el constructor de copia, el destructor y el operador de asignación.

(2) Ningún compilador de C++ te obliga a que definas tus propios constructores (ninguno de ellos), destructor u operador de asignación. PERO todos los compiladores (tanto para C++ como para cualquier lenguaje) deben garantizar que todas las clases (predefinidas y definidas por el usuario) sean al menos clases canónicas.

Es decir, que tanto si defines como si no tus propios constructores, destructores y operador de asignación, internamente el código objeto de tus clases tendrán DEFINIDAS su implementación como clase canónica.

¿Qué ocurre en C++ cuando no defines constructor de copia y/o operador de asignación? Sencillamente que el compilador los creará para que estas operaciones realicen una copia BIT A BIT. Si declaras miembros de la clase de tipo puntero, estos contructores de copia y/o operadores de asignación "prefabricados" por el compilador lo que harán es hacer una copia bit a bit, es decir, copiarán la dirección de memoria que tenga el objeto origen.

Recomendación (mejor dicho **OBLIGACIóN**): siempre que utilices memoria dinámica en tus clases, deberías de definir la clase canónica de dicha clase. Deberás definir al menos: Constructor por defecto, constructor de copia, destructor y operador de asignación.

Es muy importante que definas la forma canónica de las clases que hagan uso de memoria dinámica porque lo lógico cuando haces uso (implícito o explícito) del constructor de copia o del operador de asignación es que quieras DUPLICAR dicha memoria dinámica. Lo menos probable es que quieras guardar dos punteros que apunten a la misma dirección de memoria.

El constructor de copia además de ser llamado explícitamente ante declaraciones del tipo MiClase obj2(obj1); es llamado de modo implícito en numerosas situaciones: cuando se pasan parámetros por valor, cuando se devuelven objetos (ni referencias ni punteros. Lo que se devuelve es el propio objeto) y no recuerdo si en alguna más (me da que sí. Lo suyo es tener un libro de consulta al respecto).

El operador de asignación es también vital, obviamente. Cuando se defina hay que controlar la situación de "autoasignación".

Saludos

return 0;
Responder | Citar | Moderar | Mensaje Privado
Sawyer


62 envíos
Desconectado

#7
RE: Duda con memoria dinamica en clases22-03-2010 a las 21:17:36

Gracias por la repuesta realloc tu me entendiste bien a lo que iba yo (a diferencia de Sorancio ). Ahora entiendo que el constructor copia es una "obligacion", pero mi pregunta es que si yo uso memoria dinamica, lei por ahi que el compilador te crea un constructor copia que lo que hace es que al ser instanceado un objeto se llama al constructor copia y que este apunta la misma memoria que la variable creada al instancear al objeto y que luego esta "copia" se elimina y por lo tanto se libera la memoria y nuestra primera variable (la creada al instancear el objeto) queda apuntando a nada. Ojala me hayan entendido y me saquen de la duda.

"Las mejores cosas ocurren, cuando menos las esperamos"
Responder | Citar | Moderar | Mensaje Privado