Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-11-2013, 12:09   #1
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
[C++] Chiamare delete su un iterator

Sono sempre dietro a fare esercizi in C++, non credo di aver capito bene cosa faccia questo codice (l'ultimo for):

Codice:
vector<MyClass*> elements;

for( int i=0; i < 512; ++i )
     elements.push_back(new MyClass);

for( vector<MyClass*>::iterator j = elements.begin(); j != elements.end(); ++j )
     delete *j;
Debuggando mi sono accorto che l'ultimo for non fa altro che richiamare il distruttore per gli oggetti ma non li elimina.

Quel che so è che gli iterator sono puntatori, dunque j è un puntatore a oggett MyClass*.
Quando eseguo delete *j quindi sto dicendo di liberare lo spazio in memoria dell'oggetto MyClass* che, per quel che ne so, dovrebbero essere gli elementi dentro al vettore.

So che l'intero ciclo for può essere eliminato e può essere richiamato semplicemente empty() sul vettore se l'obietto è solo svuotarlo ma in questo caso i distruttori non vengono richiamati ed io ho bisogno di farlo.

Cercando su internet ho trovato che la soluzione potrebbe essere:
Codice:
delete * j;  
j = elements.erase(j);
però non ho trovato la spiegazione del perchè.

Ultima modifica di -Ivan- : 18-11-2013 alle 13:59.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2013, 13:59   #2
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
questo non e' C...
Hai ragione anche te...modificato.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2013, 15:07   #3
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
Sono sempre dietro a fare esercizi in C++, non credo di aver capito bene cosa faccia questo codice (l'ultimo for):

Codice:
vector<MyClass*> elements;

for( int i=0; i < 512; ++i )
     elements.push_back(new MyClass);

for( vector<MyClass*>::iterator j = elements.begin(); j != elements.end(); ++j )
     delete *j;
Debuggando mi sono accorto che l'ultimo for non fa altro che richiamare il distruttore per gli oggetti ma non li elimina.

Quel che so è che gli iterator sono puntatori, dunque j è un puntatore a oggett MyClass*.
Quando eseguo delete *j quindi sto dicendo di liberare lo spazio in memoria dell'oggetto MyClass* che, per quel che ne so, dovrebbero essere gli elementi dentro al vettore.

So che l'intero ciclo for può essere eliminato e può essere richiamato semplicemente empty() sul vettore se l'obietto è solo svuotarlo ma in questo caso i distruttori non vengono richiamati ed io ho bisogno di farlo.

Cercando su internet ho trovato che la soluzione potrebbe essere:
Codice:
delete * j;  
j = elements.erase(j);
però non ho trovato la spiegazione del perchè.
La soluzione è corretta, ma io farei
for ([...])
delete *j;
elements.empty(); // (se empty fa quel che dici, non ricordo ma mi fido).

Il perchè è: con lo statement delete cosa fai? Ottieni l'oggetto corrispondente all'iteratore, con l'operatore di dereferenziazione, che è un puntatore ad oggetto, poi chiami il delete su quel puntatore, quindi liberi la heap (la memoria dinamica) dall'oggetto puntato dal puntatore. Cioè
Codice:
delete *j;
è equivalente a:
Codice:
MyClass* tempPointer = *j;
delete tempPointer;
A questo punto il tuo puntatore punta a una zona di memoria dove non c'è più un oggetto, però il puntatore in sè, che è una variabile, rimane nel vettore.
A questo punto con elements.empty cancelli dalla memoria tutti gli elementi del vettore, cioè i puntatori a oggetti MyClass che non puntano più a niente.

Claro?
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2013, 17:26   #4
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
...
Clarissimo, grazie!
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Sony a ISE 2026: display, soluzioni imme...
Sony punta sull'IA: brevettati i podcast...
Logitech G Astro A50, le cuffie gaming d...
Lenovo a ISE 2026: smart collaboration, ...
GeForce RTX 5000 SUPER cancellate e RTX ...
Substack conferma violazione: esposti da...
L'IA costa caro. Oracle punta a raccogli...
OpenAI lancia Frontier: il cervello cent...
Questo robot aspirapolvere lava sempre c...
Il PC non si avvia? ASRock invita a cont...
8 smartphone Android in forte sconto su ...
Samsung House apre a Milano: la casa tec...
Broadcom esclude i cloud provider pi&ugr...
Allerta sicurezza per n8n: come protegge...
NIO raggiunge il primo storico profitto ...
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: 17:58.


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