[C++]Dubbio sul memory leak

di Anonimizzato13171 il
9 risposte
Ciao a tutti, ho un dubbio su una porzione di codice: non so se c'è un memory leak oppure no.
ho creato la classe banca, che contiene un array dinamico (con la sua capacità e gli elementi realmente contenuti) di oggetti di classe conto corrente.
tramite l'operatore ++ faccio aggiungere un nuovo conto corrente all'interno dell'array dinamico: se gli elementi contenuti sono uguali alla capcità, rialloco l'array e provvedo ad inserire un nuovo elemento.
il metodo per riallocare è questo:
Banca& Banca::realloc(void)
{
	this->capacity *= 2;
	Conto *temp = new Conto[capacity];

	for (int i = 0; i < size; i++)
		temp[i] = conti[i];

	conti = temp;
	delete[] temp;
	temp = NULL;
	return *this;
}
il programma funziona senza problemi, ma dato che questa funzione gioca molto con la memoria, non vorrei che funzionasse soltanto per culo e non perché è corretto il codice.
c'è qualche memory leak o qualche altro problema riguardante l'utilizzo inutile di memoria?

9 Risposte

  • Penso che

    conti

    sia il vecchio puntatore. Ma non lo deallochi ...

    Anzi, deallochi temp che dovrebbe essere il nuovo puntatore ...

    Altro che memory leak ... è proprio sbagliato ...

    P.S. Perché la realloc restituisce qualcosa?
  • Conti è l'array dinamico della classe, metre temp il nuovo array che rialloco.

    quindi la soluzione corretta sarebbe questa?
    Banca& Banca::realloc(void)
    {
    	this->capacity *= 2;
    	Conto *temp = new Conto[capacity];
    
    	for (int i = 0; i < size; i++)
    		temp[i] = conti[i];
    
    	delete[] conti;
    	conti = temp;
    	return *this;
    }
    ma quando si dealloca un array dinamico, non viene deallocato anche il puntatore ad esso?
    quindi non è errato, dopo aver dellocato conti, fare conti = temp?

    è sbagliato restituire *this con questo metodo?
  • Sia conti che temp sono puntatori. Ciò che viene allocato/deallocato è lo spazio puntato non il puntatore.

    Non vedo perché questo metodo dovrebbero restituire qualcosa.

    Quello a cui devi pensare piuttosto è l'eventualità che l'allocazione fallisca per mancanza di memoria.
  • oregon ha scritto:


    Sia conti che temp sono puntatori. Ciò che viene allocato/deallocato è lo spazio puntato non il puntatore.

    Non vedo perché questo metodo dovrebbero restituire qualcosa.

    Quello a cui devi pensare piuttosto è l'eventualità che l'allocazione fallisca per mancanza di memoria.
    ah, credevo venisse eliminato anche il puntatore.
    ad ogni modo, il codice scritto così è corretto?
    void Banca::realloc(void)
    {
    	this->capacity *= 2;
    	Conto *temp;
    
    	try
    	{
    		temp = new Conto[capacity];
    	}
    	catch (bad_alloc e)
    	{
    		cerr << e.what() << endl;
    	}
    
    	for (int i = 0; i < size; i++)
    		temp[i] = conti[i];
    
    	delete[] conti;
    	conti = temp;
    }
  • Come potrei fare quindi per correggere l'errore, se si presentasse? non ne ho proprio idea...
    dovrei fare il delete di temp e terminare il programma?
  • Devi fare tutto il lavoro nella try
  • oregon ha scritto:


    Devi fare tutto il lavoro nella try
    grazie mille, ora mi è tutto più chiaro.
  • Di nulla ... spero che il tuo codice sia adesso corretto ...
Devi accedere o registrarti per scrivere nel forum
9 risposte