Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: [C++] Nomenclatura

  1. #1

    [C++] Nomenclatura

    Ciao a tutti.
    Mi sono reso conto che io chiamo array dinamici gli array allocati in runtime e assegnati a un puntatore.

    codice:
    int* arrayPtr = new int[size]
    Però di dinamico non hanno un bel niente, nel senso che una volta allocati non cambiano la loro dimensione. Allora...

    Hanno un nome? Se si, quale?

    Grazie.

  2. #2
    Array dinamico è il nome giusto

    Gli array statici invece sono quelli dichiarati con i [].

    Gli array dinamici possono essere cambiati di dimensione, utilizzando realloc().

    Invece quelli statici no, perchè i bytes sono staticamente allocati nel codice, e non sull'heap.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: [C++] Nomenclatura

    Originariamente inviato da RooccoXXI
    Ciao a tutti.
    Mi sono reso conto che io chiamo array dinamici gli array allocati in runtime e assegnati a un puntatore.

    codice:
    int* arrayPtr = new int[size]
    Però di dinamico non hanno un bel niente, nel senso che una volta allocati non cambiano la loro dimensione. Allora...

    Hanno un nome? Se si, quale?

    Grazie.
    vettore o array (e basta)
    eventualmente (ma non si specifica praticament mai) "sullo heap"

  4. #4
    Originariamente inviato da lolide
    Array dinamico è il nome giusto

    Gli array statici invece sono quelli dichiarati con i [].

    Gli array dinamici possono essere cambiati di dimensione, utilizzando realloc().

    Invece quelli statici no, perchè i bytes sono staticamente allocati nel codice, e non sull'heap.
    So che si possono riallocare, ma mi chiedevo se senza riallocazione avessero un nome differente.

    Ma a scanso di equivoci li chiamerò array!xD.

    Comunque
    codice:
    realloc()
    in C++ a cosa corrisponde?!

  5. #5
    Originariamente inviato da RooccoXXI
    Comunque
    codice:
    realloc()
    in C++ a cosa corrisponde?!
    Se hai intenzione di reallocare la memoria allocata per un puntatore, non devi usare C++.

    Devi usare malloc(), realloc() e free() e non new e delete. Non li puoi mischiare.

  6. #6
    Si chiamano dinamici perché la loro dimensione non è impostata staticamente a compile-time ma dinamicamente a runtime.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da lolide
    Se hai intenzione di reallocare la memoria allocata per un puntatore, non devi usare C++.

    Devi usare malloc(), realloc() e free() e non new e delete. Non li puoi mischiare.
    Non si può ottenere lo stesso di realloc() con new e delete?!

    Ho letto un po' di tempo fa che malloc(), realloc() e free() sono pericolosi in C++, perché non conoscendo nulla dei costruttori e dei distruttori non li invocano, provocando un memory leak.
    Sbagliato?!

  8. #8
    Non è questione di memory leak, ma appunto del non richiamare costruttori e distruttori, per cui vai nell'undefined behavior. malloc/realloc/free si possono usare solo con i tipi POD (tipi primitivi, struct e class solo se prive di metodi virtuali e con costruttori e distruttori "banale"), mentre new e delete vanno bene in ogni caso.

    Comunque secondo me l'approccio migliore è iniziare fin da subito ad usare la STL (la classe std::vector, nello specifico) in modo da evitare di fare casino con puntatori e memory leaks fin dall'inizio.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Infatti non devi riallocare una classe. E' una cosa da fare solamente con i tipi primari come dice MItaly che comunque secondo me è una cosa fattibilissima, cioè:

    se volessi creare una classe String come con Java, alla fine devi avere sempre un puntatore interno di char che mantiene la stringa. Per ridimensionare automaticamente la String, basta fare realloc sull'array interno di char

    Se volessi fare un'array di String dinamico (StringArray), come fa std::vector, basta tenere in questa classe un puntatore a String. Usi malloc(), realloc() e free() per gestirlo e poi li inizializzi con il loro costruttore.

  10. #10
    Originariamente inviato da MItaly
    Non è questione di memory leak, ma appunto del non richiamare costruttori e distruttori, per cui vai nell'undefined behavior. malloc/realloc/free si possono usare solo con i tipi POD (tipi primitivi, struct e class solo se prive di metodi virtuali e con costruttori e distruttori "banale"), mentre new e delete vanno bene in ogni caso.

    Comunque secondo me l'approccio migliore è iniziare fin da subito ad usare la STL (la classe std::vector, nello specifico) in modo da evitare di fare casino con puntatori e memory leaks fin dall'inizio.
    Si, solitamente uso i std::vector o le std::list. Però mi piace capire come sono implementati e come funzionano!

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.