PDA

Visualizza la versione completa : [c++ MFC]mappe e puntatori


giuseppe500
16-05-2008, 10:21
ciao.
ho una struttura tagSectionProperties
con 2 dati int A e B

ho una mappa m_MapSection
CMap<CString,LPCSTR,tagSectionProperties*,tagSectionPro perties*>m_MapSection;

faccio:
tagSectionProperties* pSectProp;
pSectProp->A=1;
pSectProp->B=1;

se faccio :
tagSectionProperties* tagSection;
m_MapSection.SetAt("xxx",pSectProp);
m_MapSection.Lookup(strSectionName,tagSection);

in tagSection finiscono correttamente A = 1 e A =2

se in un altra parte del codice (successiva al setat della mappa) faccio :
tagSectionProperties* tagSectionProp;
m_MapSection.Lookup("xxx",tagSectionProp);
ho
tagSectionProp->A =88324232
perch non ho 1?
Grazie.

MItaly
16-05-2008, 14:40
Ma pSectProp inizializzato ad un indirizzo valido (ottenuto ad esempio usando new) o stai usando un puntatore "vagante"?

giuseppe500
16-05-2008, 14:51
inizializzato cosi:
tagSectionProperties* pSectProp;
ah vuoi dire che potrebbe essere un indirizzo non valido?

giuseppe500
16-05-2008, 14:57
no , ho provato anche a fare il new nella dichiarazione ma tutto rimane uguale.

MItaly
16-05-2008, 15:03
Originariamente inviato da giuseppe500
inizializzato cosi:
tagSectionProperties* pSectProp;
ah vuoi dire che potrebbe essere un indirizzo non valido?
ovvio che un indirizzo non valido, ma queste sono le basi del C/C++!
Prova con


tagSectionProperties* pSectProp = new pSectProp;
pSectProp->A=1;
pSectProp->B=1;

ricordandoti poi ovviamente di eliminarlo con delete quando non ti serve pi.

giuseppe500
16-05-2008, 15:18
Originariamente inviato da MItaly
ovvio che un indirizzo non valido, ma queste sono le basi del C/C++!
Prova con


tagSectionProperties* pSectProp = new pSectProp;
pSectProp->A=1;
pSectProp->B=1;

ricordandoti poi ovviamente di eliminarlo con delete quando non ti serve pi.
scusa ,c'era un errore nel primo post:
pSectProp un puntatore ad una struttura che esiste gia nella mia funzione(esite pSectProp),mi viene passata come parametro e viene "riempita" per poi essere ritornata alla fine della funzione(quando e caricata).
Io vorrei inserirla in una mappa cosi' com all' interno della funzione stessa per andarla a richiamare da tutta la classe tramite la mappa che una variabile membro privata.
ciao.

giuseppe500
16-05-2008, 15:23
pardon ho inizializzato la variabile con = new e tutto funziona correttamente.
Grazie.

MItaly
16-05-2008, 21:16
pSectProp un puntatore ad una struttura che esiste gia nella mia funzione(esite pSectProp),mi viene passata come parametro e viene "riempita" per poi essere ritornata alla fine della funzione(quando e caricata).
In sostanza quindi viene allocata sullo stack, e quando la funzione ritorna viene cancellata. Non puoi usare puntatori a variabili locali in strutture dati che esisteranno anche quando la funzione sar terminata.

pardon ho inizializzato la variabile con = new e tutto funziona correttamente.
Mi raccomando, ricordati poi di eliminarla con delete (quando distruggi la mappa) se non vuoi incorrere in memory leaks. In alternativa potresti memorizzare nella mappa non puntatori a strutture, ma strutture vere e proprie, in maniera che siano memorizzate all'interno della mappa (che si occupa automaticamente della loro distruzione), senza che tu ti debba occupare di allocarle/deallocarle nell'heap.

Loading