PDA

Visualizza la versione completa : [C++] Array dinamici usando puntatori e new


Rising1
12-06-2012, 15:28
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



#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)?

MItaly
12-06-2012, 15:34
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)

oregon
12-06-2012, 15:35
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)

Rising1
12-06-2012, 21:39
ok grazie a tutti, penso che userò la classe template vector, aggiornerò la discussione a breve :D

Rising1
12-06-2012, 22:12
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



#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;
}

Loading