[C++]Dubbio sul memory leak

di il
9 risposte

[C++]Dubbio sul memory leak

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

  • Re: [C++]Dubbio sul memory leak

    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?
  • Re: [C++]Dubbio sul memory leak

    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?
  • Re: [C++]Dubbio sul memory leak

    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.
  • Re: [C++]Dubbio sul memory leak

    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;
    }
  • Re: [C++]Dubbio sul memory leak

  • Re: [C++]Dubbio sul memory leak

    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?
  • Re: [C++]Dubbio sul memory leak

    Devi fare tutto il lavoro nella try
  • Re: [C++]Dubbio sul memory leak

    oregon ha scritto:


    Devi fare tutto il lavoro nella try
    grazie mille, ora mi è tutto più chiaro.
  • Re: [C++]Dubbio sul memory leak

    Di nulla ... spero che il tuo codice sia adesso corretto ...
Devi accedere o registrarti per scrivere nel forum
9 risposte