Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156

    [C++] Array dinamici usando puntatori e new

    avevo in mente un progetto ma prima volevo fare dei test più semplici.
    devo creare un array di oggetti (nel codice seguente per semplicità sono variabili intere), ma non so quanto questo array sarà grande;
    ho scritto questo codice

    codice:
    #include <iostream>
    
    using namespace std;
    
    int main(){
    int *a;
    
    
    a=new int;
    *a=3;
    a++;
    *a=2;
    a--;
    cout<<a[0]<<" "<<a[1];
    
    
    }
    è un buon modo? perchè avevo un dubbio:
    non c'è rischio che, aumentando le variabili e gli oggetti allocati, ci creino pasticci (sovrascritture varie ad esempio)?

  2. #2
    Con a=new int; tu stai allocando lo spazio per un singolo intero, mentre poi vai ad usarlo come se fosse un array; anche se per ora sembra che funzioni, stai commettendo un errore che presto o tardi ti porterà ad un segmentation fault o a sovrascrittura di altri dati.

    La cosa giusta da fare è allocare un array di dimensioni sufficienti (a=new int[numero_elementi]), e, se scopri a metà del lavoro che gli elementi da inserire risultano più del previsto, allocare un array più grande, copiarci dentro i vecchi elementi e deallocare (con delete[]) il vecchio array.*

    Tutto questo mestiere (e molto altro) lo fa automaticamente la classe template std::vector (dell'header <vector>), parte della libreria standard C++, di cui ti consiglio l'uso, sia perché è molto più semplice da usare rispetto ad un array "grezzo", sia perché usando i vector non rischi memory leak come nel caso di new/delete "libere" e puntatori normali.


    * in alternativa, se devi anche fare inserimenti a metà dell'array, puoi considerare altre strutture dati (ad esempio le liste concatenate)
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E' sbagliato. Hai allocato un solo intero ma ne utilizzi due con imprevedibili conseguenze (puoi avere un crash, può funzionare apparentemente).

    Studia meglio come utilizzare la new ...

    Parti da http://en.wikipedia.org/wiki/New_(C%2B%2B)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    ok grazie a tutti, penso che userò la classe template vector, aggiornerò la discussione a breve

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    ok, la classe vector è proprio quello che cercavo, soprattutto perchè è molto più semplice rimuovere elementi dal centro del vettore, grazie del consiglio.
    ecco il codice che ho scritto tanto per prendere dimestichezza con la classe

    codice:
    #include <iostream>
    #include <vector>
    using namespace std;
    
    class numero
    {
       public: int a;
       numero() {a=0;}
    };
    
    
    int main()
    {
    vector<numero> vettore;
    numero temporaneo;
    
    vettore.push_back(temporaneo);
    vettore.push_back(temporaneo);
    vettore.push_back(temporaneo);
    vettore.push_back(temporaneo);
    
    cout<<(int) vettore.size()<<" "; //dimensione iniziale
    vettore[2].a=5; //mi serve per dopo
    vettore.pop_back(); //rimuovo l'ultimo elemento in posizione 3
    cout<<(int) vettore.size()<<" "; // mostra 3
    vettore.erase(vettore.begin()+1); //rimuovo elementi in posizione 0 e 1
    vettore.erase(vettore.begin());   // l'elemento di indice 2 passa direttamente ad indice 0!!!!
    cout<<vettore[0].a;  //infatti stampa a video il valore 5
    
    return 0;
    }

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.