PDA

Visualizza la versione completa : [c++] puntatori e assegnamenti


maluz1
26-09-2013, 18:42
ciao a tutti!:)

ho dichiarato due puntatori a string:


string* din_vett= new string[10];
string* din_vett2= new string[20];


per reallocare il primo vettore, siccome è meglio non usare la realloc( appartenente al C ), creo un nuovo puntatore a string sempre con la new.

mi sapete spiegare perchè se io uso questo metodo:


din_vett2= din_vett1;

il programma crasha?
dopotutto ho assegnato la locazione di memoria puntata di din_vett alla locazione di memoria puntata da din _vett2.

e come mai con:


*din_vett2= *din_vett;

il programma funziona correttamente?

grazie in anticipo:)

oregon
26-09-2013, 22:26
Non ho capito bene ... cosa hai scritto ? Mostra il codice completo ...

maluz1
26-09-2013, 22:41
era solo un programma in cui volevo vedere se era possibile creare in c++ ovviamente dei vettori dinamici di stringhe, siccome non ero sicuro poichè anche le stringhe sono trattate dinamicamente... il codice è composto proprio da due righe



#include <iostream>

using namespace std;

string* load_vector( string str_vector[], int parameter )
{
str_vector[parameter]= "hello";
return str_vector;
}

main()
{
string vett_string[10];
string* din_vett= new string[10];
string* din_vett2= new string[20];
int i= 0;

for( int l= 0; l < 10; l++ )
load_vector( vett_string, l );

for( int m= 0; m < 10; m++ )
cout << vett_string[m] << endl;

cout << "------------------" << endl;

din_vett2= din_vett;

for( int l= 0; l < 20; l++ )
load_vector( din_vett2, l );

for( int m= 0; m < 20; m++ )
cout << din_vett2[m] << endl;

delete[] din_vett2;
delete[] din_vett;
}



ma era solo un programma di prova per ricordarmi un attimo i puntatori con stringhe ecc...
l'unica domanda è questa:

din_vett2= din_vett;

perchè deve dare problemi?
a me andrebbe bene anche

*din_vett2= *din_vett;

ma credo che a livello di prestazioni sia più conveniente, ma soprattutto per curiosità ,preferisco capire il perchè?

grazie della risposta:)

oregon
26-09-2013, 23:06
Ma tu cosa pensi di fare esattamente con

din_vett2= din_vett;

?

maluz1
26-09-2013, 23:21
Appunto per quello:
Avevo letto una volta che assegnare un puntatore a un altro puntatore aveva un significato ingannevole, ma non ricordo qual e?

A prima vista mi verrebbe in mente che a din_vett2 assegno lo stesso indirizzo della locazione di memoria puntata da din_vett, pero sicuramente non e cosi:
L unica idea che mi viene in mente è che siccome è un puntatore ad una string, il compilatore questa scrittura :

*Din_vett la interpreta come il puntatore al primo elemento

Mi potresti spiegare il vero significato di din_vett2= din_vett?

maluz1
27-09-2013, 06:57
Anzi
Din_vett2= din_vett
Forse significa che assegno la stringa din_vett a din_vett2
E quindi se io facessi un cast su entrambi i puntatori : ( void * )
Dovrebbe finzionare?

lovesemiramide
27-09-2013, 09:33
A prima vista mi verrebbe in mente che a din_vett2 assegno lo stesso indirizzo della locazione di memoria puntata da din_vett, pero sicuramente non e cosi...

Invece è proprio così. In quel modo tu assegni l'indirizzo di din_vett a din_vett2.

Il problema viene qui:


for( int l= 0; l < 20; l++ )
load_vector( din_vett2, l );


Infatti tu consideri din_vett2 come un puntatore ad un vettore di 20 elementi, ma in realtà sta puntando a din_vett che è di 10 elementi.

Nota bene che quando assegni l'indirizzo di din_vett a din_vett2 non deallochi la memoria precedentemente puntata da din_vett2. Inoltre se alla fine din_vett2 sarà uguale a din_vett allora dovrai chiamare una volta delete[], altrimenti cerchi di deallocare la stessa area di memoria due volte.

maluz1
27-09-2013, 15:11
grazie mille!:)
proprio non ci avevo pensato...
grazie ancora della tua disponibilità!

lovesemiramide
27-09-2013, 15:33
Prego! :ciauz:

Loading