PDA

Visualizza versione completa : Dubbio C++


wilhelm
08-04-2003, 14.20.22
Ho letto due guide (non approfondite lo so) sul C++ ma non sono bene riuscito a capire la filosofia dell'allocazione dinamica e il suo funzionamento.
Ad esempio:
perchè se scrivo


int *n = new int[5];
int m = n[6];


non dà errore?

Perchè

[I]
int *n = new int[5];
int *m,b;
n[0]=4
n[6];
m=&n[6];
cout << n[6];
delete[] n;
b=*m;
cout << b;
[I]

e scopro che non da errore b=4 quando n[6] era un numero stranissimo?

P8257 WebMaster
08-04-2003, 18.55.16
Perché dovrebbe dare errore scusa?.. dimentichi la filosofia del c/c++?

Bye :cool:

wilhelm
08-04-2003, 20.15.20
Però mi stupisce il fatto che dichiarando un array di 5 elementi possa accedere al settimo.

P8257 WebMaster
08-04-2003, 22.10.06
Non deve stupirti, può accedere anche al ventesimo .. o più .. non ci sono controlli, è qui il bello (e il brutto) .. la filosofia è: il programmatore l'ha scritto, sarà senz'altro cosciente di ciò che fa!

La domanda è piuttosto: cosa ci troverai nel ventesimo elemento di quel vettore non inizializzato? .. e cosa succederà se andrai a scriverci?... :D

Bye :cool:

Deep73
08-04-2003, 23.36.47
Originariamente inviato da P8257 WebMaster
Non deve stupirti, può accedere anche al ventesimo .. o più .. non ci sono controlli, è qui il bello (e il brutto) .. la filosofia è: il programmatore l'ha scritto, sarà senz'altro cosciente di ciò che fa!

La domanda è piuttosto: cosa ci troverai nel ventesimo elemento di quel vettore non inizializzato? .. e cosa succederà se andrai a scriverci?... :D

Bye :cool:

appunto.... idem quando usi puntatori col Delphi... l'han reso uguale al c++ più o meno.

Ciauz

P8257 WebMaster
08-04-2003, 23.38.37
Si, puntatori molto potenti e altrettanto pericolosi .. proprio come l'ereditarietà multipla di cui il C++ dispone.

Bye :cool:

LoryOne
09-04-2003, 08.08.52
Mi fa piacere sapere che sei uno che sperimenta e cerca di capire a fondo le cose wilhelm.
Solo così si carpiscono i "segreti più intimi" del linguaggio di programmazione a tutto vantaggio del programmatore che ne fa uso:) (ed abuso nel caso del C++ :D)

P8257 WebMaster
09-04-2003, 11.45.22
Questo è uno dei classici esempi di quei comportamenti cosiddetti trasparenti di cui tanto si è parlato, come differenza tra i linguaggi:

In C/C++ come già visto, non vi è alcun controllo e/o inizializzazione da parte del linguaggio, ciò vuol dire che se decido di creare qualsiasi entità variabile o costante non saprò mai cosa contengono a meno che non sia io stesso a definirlo inizializzandolo manualmente.
In pratica vengono solamente create le allocazioni di memoria necessarie per contenere l'entità; nel caso del puntatore invece, il discorso è ancora più semplice, viene creata un'etichetta, un riferimento ad un'area di memoria che al momento potrebbe anche non essere allocata o contenere riferimenti o porzioni di qualsiasi cosa.

In altri linguaggi il controllo è trasparente e molto più gestito a basso livello, ciò vuol dire che creando un'entità posso già essere sicuro che il linguaggio stesso mi garantisce un'inizializzazione, in modo che io non debba preoccuparmene.

Tutte queste procedure automaticamente gestite vanno a scapito dell'efficienza e della potenza (a volte) dello stesso linguaggio, l'esempio più drammatico di mal-gestione dei tipi di dati è rappresentato dai linguaggi che permettono al programmatore di creare un'entità assegnando "al volo" qualsiasi dato ad essa senza dover specificarne il tipo preventivamente.

In PHP ad esempio, posso creare quando voglio un'entità di nome $a per esempio e non preoccuparmi di inizializzarla, il linguaggio mi garantisce che sia vuota.. ma in realtà cos'é? .. una stringa? un intero? un long? ..
E' un'istanza che viene presa in considerazione dal linguaggio solo in fase di valorizzazione, capite che ciò implica che ogni valore assegnato ad $a sia valutato "al volo" riducendo notevlmente l'efficacia del linguaggio stesso.

Se assegno un intero, verrà creato uno spazio di memoria, verrà valutato il tipo di dato inserito, verrà inserito nell'istanza, la stessa istanza verrà riallocata. Nel caso poi si decidesse di stampare tale valore, viene Ri-valutato il tipo di dato contenuto, eventualmente fatta una conversione in stringa e passata in output.

il tutto solo scrivendo:
$a = 1;
print $a;

Questo disabitua i programmatori ad usare i tipi e soprattutto il casting che è utilizzato in automatico.

Bye :cool:

wilhelm
09-04-2003, 13.16.57
Infatti il dubbio mi era venuto proprio andando a scriverci:
il valore dopo l'inizializzazione è proprio quello assegnato.
Forse però se prima di deallocare la memoria del primo array dinamico ne alloco dinamicamente un secondo la memoria di n[6] viene sovrascritta. Può essere?

P8257 WebMaster
09-04-2003, 15.50.48
wilhelm ha scritto:
Infatti il dubbio mi era venuto proprio andando a scriverci:
il valore dopo l'inizializzazione è proprio quello assegnato.
Forse però se prima di deallocare la memoria del primo array dinamico ne alloco dinamicamente un secondo la memoria di n[6] viene sovrascritta. Può essere?

C'è un'alta probabilità dato che le operazioni che fai sono contigue, ma non puoi saperlo con certezza, in linea di massima si tende ad inizializzare gli array (o le variabili) in ogni caso e a dimensionarli per il loro corretto utilizzo, così si ha la certezza che il compilatore predisponga correttamente le aree di memoria.

Bye :cool:

wilhelm
09-04-2003, 18.47.56
Thank you!