Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++ MFC]mappe e puntatori

    ciao.
    ho una struttura tagSectionProperties
    con 2 dati int A e B

    ho una mappa m_MapSection
    CMap<CString,LPCSTR,tagSectionProperties*,tagSecti onProperties*>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.

  2. #2
    Ma pSectProp è inizializzato ad un indirizzo valido (ottenuto ad esempio usando new) o stai usando un puntatore "vagante"?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    è inizializzato cosi:
    tagSectionProperties* pSectProp;
    ah vuoi dire che potrebbe essere un indirizzo non valido?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    no , ho provato anche a fare il new nella dichiarazione ma tutto rimane uguale.

  5. #5
    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
    codice:
    tagSectionProperties* pSectProp = new pSectProp;
    pSectProp->A=1;
    pSectProp->B=1;
    ricordandoti poi ovviamente di eliminarlo con delete quando non ti serve più.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Originariamente inviato da MItaly
    È ovvio che è un indirizzo non valido, ma queste sono le basi del C/C++!
    Prova con
    codice:
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    pardon ho inizializzato la variabile con = new e tutto funziona correttamente.
    Grazie.

  8. #8
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.