Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [c-c++] liste concatenate

    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 è:
    codice:
    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!!

  2. #2
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    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
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  3. #3
    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ì.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Neanche, in C++ usa sempre new/delete e finita lì.
    Già ho dimenticato di aggiungere "al massimo" alla frase
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  5. #5
    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!

  6. #6
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    ok grazie mille! mi sono fatto un idea generale comunque!

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

  8. #8
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    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
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.