PDA

Visualizza la versione completa : [c-c++] liste concatenate


maluz1
13-07-2013, 11:40
ciao a tutti!
ho scritto un programma( c++ ) nel quale ho implementato una lista dinamica, ma ho verificato che nella funzione per creare un nuovo nodo( in testa nel mio caso ), la malloc( del c ) e la new( del c++ ) restituiscono risultati differenti, in particolare:
- la malloc mi genera un errore a runtime
- la new non genera nessun errore e funziona alla perfezione

la mia lista è:


struct lista
{
string info;
lista *next;
};


nella funzione di creazione del nodo

MALLOC:
nuovo_nodo= (lista*) malloc( sizeof( lista ) );

NEW:
nuovo_nodo= new lista;

potreste spiegarmi la differenza tra malloc e new e come è possibile che si verifichi questo errore?

grazie in anticipo!! :)

KrOW
13-07-2013, 22:02
Ciao ... La differenza sostanziale tra "new" e "malloc" è che "new" richiama il costruttore di un oggetto mentre "malloc" no. Guardala così: entrambe allocano spazio sufficiente per l' oggetto/i ma "new" richiama anche il costruttore. Nel tuo caso viene allocato lo spazio necessario per l' oggetto di tipo "lista". Siccome ogni oggetto di tipo "lista" possiede anche un oggetto di tipo "string" ("info"), allocando l' oggetto con "new" tutti i costruttori (di lista, se esiste, e degli oggetti figli come "info") verrano richiamati (ovviamente nel giusto ordine) mentre un allocazione con "malloc" alloca SOLTANTO lo spazio per un oggetto "lista" (e i suoi oggetti figli) ma non richiama i vari costruttori. Siccome i costruttori hanno l' importante ruolo di inizializzare nel modo giusto i vari oggetti, l' allocazione con "malloc" porta ad una non-inizializzazione dell' oggetto "info", quindi ogni accesso ad esso porterà probabilmente ad un crash. Lo stesso discorso vale per la deallocazione con "free" e "delete" (il primo non richiama il distruttore mentre il secondo si).
ERGO: USA NEW PER LA CORRETTA COSTRUZIONE DEGLI OGGETTI, ED UTILIZZA MALLOC SOLO PER ALLOCAZIONE DI DATI RAW. (nota che le funzioni "malloc" e "free" sono delle funzioni C ereditate dal C++ mentre "new" e "delete" sono degli operatori/funzioni creati esclusivamente per C++). Spero di essere stato chiaro. Ciao :ciauz: :ciauz: :ciauz:

MItaly
13-07-2013, 22:50
Originariamente inviato da KrOW
ERGO: USA NEW PER LA CORRETTA COSTRUZIONE DEGLI OGGETTI, ED UTILIZZA MALLOC SOLO PER ALLOCAZIONE DI DATI RAW.
Neanche, in C++ usa sempre new/delete e finita lì.

KrOW
13-07-2013, 23:02
Neanche, in C++ usa sempre new/delete e finita lì.
Già ho dimenticato di aggiungere "al massimo" alla frase :zizi: :zizi: :zizi:

maluz1
14-07-2013, 10:34
Veramente un ottima spiegazione! Complimenti e grazie infinite a entrambi!:)
T sarei molto grato se tu mi spiegassi anche cosa è un dato RAW.

Comunque grazie ancora a tutti!:)

MItaly
14-07-2013, 16:02
Credo che si riferisse ai cosiddetti tipi POD ("plain old data"); lo standard C++ ne dà una definizione precisa ma piuttosto complicata (vedi C++11 §9 ¶5-10). Sostanzialmente sono struct/classi non virtuali, contenenti solo campi POD, con costruttore "banale" (=si limita ad inizializzare dei campi) o senza costruttore e che non fa uso di ereditarietà virtuale (ci sono un po' di altre limitazioni, ma il concetto di fondo è questo); nei POD sono poi ovviamente ricompresi i tipi primitivi.
L'idea è che si tratti di tipi per cui il non richiamare il costruttore non causa danni e per cui la copia si può fare "a pedate" con una memcpy.

In ogni caso, se usi sempre new non ti devi preoccupare di questa roba.

maluz1
14-07-2013, 16:19
ok grazie mille! :) mi sono fatto un idea generale comunque!

ciao a tutti e vi ringrazio nuovamente dell'aiuto che mi avete dato

KrOW
14-07-2013, 19:04
Credo che si riferisse ai cosiddetti tipi POD ("plain old data")...
Esatto


In ogni caso, se usi sempre new non ti devi preoccupare di questa roba.
Acconsento

Loading