Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Liberar memoria a la que apunta un puntero

Estas en el tema de Liberar memoria a la que apunta un puntero en el foro de C/C++ en Foros del Web. Tengo un puntero que apunta a un array de punteros. Este array puede ir creciendo y para añadir un nuevo elemento creo un nuevo puntero ...
  #1 (permalink)  
Antiguo 23/11/2007, 04:59
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 19 años, 5 meses
Puntos: 0
Liberar memoria a la que apunta un puntero

Tengo un puntero que apunta a un array de punteros.
Este array puede ir creciendo y para añadir un nuevo elemento creo un nuevo puntero a array de punteros con un tamaño superior en una unidad.
Mi duda es si al copiar los valores del viejo array de punteros debo eliminar el contenido de cada posición despues de copiar el valor al nuevo array.

No se si me he explicado bien... igual con el codigo se entiende a que me refiero

Código:
class protocolo
{
	unsigned char packetSize;
	unsigned char* packetNumber;
	unsigned char** data;
	
	void addData( int data )
	{	int packet_number = this->getPacketNumber() + 1;
		this->setPacketNumber( packet_number );

		//Hay que redimensionar el array en una posición
		unsigned char** temp;							//Puntero a un array de punteros
		temp = new unsigned char*[ packet_number ];		//Array de punteros con PACKET_NUMBER posiciones
	
		//Copiamos el array
		for( int i=0; i< (packet_number-1); i++ )
		{
			temp[i] = this->data[i];	//Copiamos el valor o la referencia??
			delete this->data[i];		//Y me cargo el viejo		DEBO ELIMINARLO??
		}

		delete [] this->data;	//Liberamos la memoria usada por this.data
		this->data = temp;		//this.data apunta al nuevo array de datos

		//ahora hay que añadir el nuevo dato
		//Cada posicion de this->data es otro array de chars de longitud (int)packetSize
		int tamanyo = (int)this->packetSize;
		unsigned char* nuevo_dato = new unsigned char[ tamanyo ];	//Reservamos memoria para el nuevo campo

		cout << "Posicion de memoria del nuevo dato:" << (int)nuevo_dato << "\n";

		nuevo_dato = this->splitInt( data, tamanyo );				//Copiamos el DATA a el nuevo_dato
		this->data[ (tamanyo-1) ];									//Hacemos que la ultima posicion apunte al nuevo_dato
	}
}
De hecho si hago el delete this->data[i] el programa sigue funcioando correctamente, asi que supongo que en la linea anterior ( temp[i] = this->data[i]; ) lo que está realizando es una copia por lo tanto si que debería eliminar this->data[i] pero no acabo de ver el porque: no estoy copiando la dirección de memoria?

PD:No, si hago el delete this->data[i] el programa no funciona correctamente... el ultimo valor introducido machaca al que le precede por lo que supongo que estoy copiando la dirección de memoria.

Última edición por clinisbut; 23/11/2007 a las 05:23
  #2 (permalink)  
Antiguo 23/11/2007, 07:18
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Re: Liberar memoria a la que apunta un puntero

Estás usando C++, así que podrías usar la STL para manejar tus datos.
  #3 (permalink)  
Antiguo 26/11/2007, 02:00
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 19 años, 5 meses
Puntos: 0
Re: Liberar memoria a la que apunta un puntero

Ya pero de momento quiero hacerlo así.
Prefiero aprender antes conocer del todo como funciona la parte de "mas bajo nivel" de C y luego ya me pondré a usar elementos genericos.

Última edición por clinisbut; 27/11/2007 a las 09:16
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:51.