Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-02-2012, 18:33   #1
alessandrom
Member
 
L'Avatar di alessandrom
 
Iscritto dal: Aug 2005
Città: MB
Messaggi: 126
[C++] Strano problema con deallocazione memoria.

Ciao a tutti,

sto realizzando un programma per rappresentare le matrici.
Il programma funziona molto bene tranne quando uso l'operator= per copiare una matrice già esistente.

Se eseguo con valgrind mi dice questo:
Codice:
==3283== Invalid read of size 8
==3283==    at 0x4026DA: SparseMatrix<int>::clearAll() (SparseMatrix.h:285)
==3283==    by 0x401D2F: SparseMatrix<int>::~SparseMatrix() (SparseMatrix.h:561)
==3283==    by 0x401B61: main (main.cpp:67)
==3283==  Address 0x596f5b8 is 8 bytes inside a block of size 24 free'd
==3283==    at 0x4C27FF2: operator delete(void*) (vg_replace_malloc.c:387)
==3283==    by 0x402713: SparseMatrix<int>::clearAll() (SparseMatrix.h:292)
==3283==    by 0x401D2F: SparseMatrix<int>::~SparseMatrix() (SparseMatrix.h:561)
==3283==    by 0x401B52: main (main.cpp:88)
==3283== 
==3283== Invalid read of size 8
==3283==    at 0x4026FC: SparseMatrix<int>::clearAll() (SparseMatrix.h:291)
==3283==    by 0x401D2F: SparseMatrix<int>::~SparseMatrix() (SparseMatrix.h:561)
==3283==    by 0x401B61: main (main.cpp:67)
==3283==  Address 0x596f5c0 is 16 bytes inside a block of size 24 free'd
==3283==    at 0x4C27FF2: operator delete(void*) (vg_replace_malloc.c:387)
==3283==    by 0x402713: SparseMatrix<int>::clearAll() (SparseMatrix.h:292)
==3283==    by 0x401D2F: SparseMatrix<int>::~SparseMatrix() (SparseMatrix.h:561)
==3283==    by 0x401B52: main (main.cpp:88)
==3283== 
==3283== Invalid free() / delete / delete[]
==3283==    at 0x4C27FF2: operator delete(void*) (vg_replace_malloc.c:387)
==3283==    by 0x402713: SparseMatrix<int>::clearAll() (SparseMatrix.h:292)
==3283==    by 0x401D2F: SparseMatrix<int>::~SparseMatrix() (SparseMatrix.h:561)
==3283==    by 0x401B61: main (main.cpp:67)
==3283==  Address 0x596f5b0 is 0 bytes inside a block of size 24 free'd
==3283==    at 0x4C27FF2: operator delete(void*) (vg_replace_malloc.c:387)
==3283==    by 0x402713: SparseMatrix<int>::clearAll() (SparseMatrix.h:292)
==3283==    by 0x401D2F: SparseMatrix<int>::~SparseMatrix() (SparseMatrix.h:561)
==3283==    by 0x401B52: main (main.cpp:88)
==3283== 
==3283== 
==3283== HEAP SUMMARY:
==3283==     in use at exit: 0 bytes in 0 blocks
==3283==   total heap usage: 48 allocs, 49 frees, 672 bytes allocated
==3283== 
==3283== All heap blocks were freed -- no leaks are possible
==3283== 
==3283== For counts of detected and suppressed errors, rerun with: -v
==3283== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 4 from 4)
Ho capito che l'errore è nella funzione clearAll invocata nel distruttore, ma non riesco a capire quale sia il problema.

Questo è il codice di clearAll:
Codice:
void clearAll(){
	if(matrix==NULL) return;
	while(matrix!=NULL){
		while(matrix->values!=NULL){
			mcol *aux=matrix->values;
			matrix->values=matrix->values->next;
			delete aux;			
		}
		mrow *aux2=matrix;
		matrix=matrix->next;
		delete aux2;		
	}	
	matrix=NULL;
}

Ultima modifica di alessandrom : 07-02-2012 alle 20:32.
alessandrom è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2012, 22:27   #2
Cait Sith
Senior Member
 
L'Avatar di Cait Sith
 
Iscritto dal: Apr 2005
Messaggi: 309
scusa, visto che il valgrind ti dice esattamente dov'è il problema non potresti postare i numeri di riga del codice?

comunque anche se i nodi vengono al pettine nel clearAll, è possibile che l'errore sia in una mancata inizializzazione di un elemento da qualche altra parte

Ultima modifica di Cait Sith : 07-02-2012 alle 22:30.
Cait Sith è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2012, 22:53   #3
alessandrom
Member
 
L'Avatar di alessandrom
 
Iscritto dal: Aug 2005
Città: MB
Messaggi: 126
Quote:
Originariamente inviato da Cait Sith Guarda i messaggi
scusa, visto che il valgrind ti dice esattamente dov'è il problema non potresti postare i numeri di riga del codice?

comunque anche se i nodi vengono al pettine nel clearAll, è possibile che l'errore sia in una mancata inizializzazione di un elemento da qualche altra parte
La riga incriminata è il secondo delete, delete aux2.

E il problema è un altro, che ho "risolto", ovvero l'operatore di assegnamento.
Così funziona:
Codice:
	SparseMatrix& operator=(const SparseMatrix& sm){
		rows=sm.getRows();
		cols=sm.getCols();
		def=sm.getDef();
		msize=sm.getSize();
		clearAll();
		matrix=NULL;
		copyAll(sm.getMatrix());
		return *this;
	}
Se però lo volessi fare templato per poter copiare anche matrici di tipi diversi compatibili mi da quell'errore.
Uso lo stesso codice templato nel copy constructor e là non da errori:
(T è il tipo di cui sparsematrix è contenitore, è definito con la classe)
Codice:
template<typename T1>
	 SparseMatrix<T>( SparseMatrix<T1>& sm){
		rows=sm.getRows();
		cols=sm.getCols();
		def=sm.getDef();
		matrix=NULL;
		msize=0;
		copyAll<T1>(sm.getMatrix());
	}
alessandrom è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Colpo grosso di Zuckerberg: Meta assume ...
Addio ai matrimoni con l'intelligenza ar...
Le sonde spaziali ESA ExoMars e Mars Exp...
Roscosmos: static fire per i propulsori ...
Alcune partite NBA saranno trasmesse in ...
Intel Core 13000 e 14000 aumentano uffic...
Gemini sta per arrivare in Google Maps: ...
2 minuti per vedere le 27 offerte imperd...
Ray-Ban Meta Display: tecnologia sorpren...
Un mini PC a prezzo stracciato, non cerc...
Al via i coupon nascosti di ottobre: qua...
Ferrari Elettrica si aggiorna solo in of...
Doppio sconto sugli smartphone top Xiaom...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v