Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151

    [ c++ ] Puntatore ad un vector<Classe>

    Salve a tutti.

    In un programma faccio uso del seguente tipo di dato:

    codice:
    vector<A>* p = new vector<A>();
    Tutto funziona bene.
    La mia domanda è questa:

    E' possibile, in caso di riallocazione del vector, ottenere un puntatore non valido?
    Questo codice secondo voi è sicuro?

    Grazie
    Saluti

  2. #2

    Re: [ c++ ] Puntatore ad un vector<Classe>

    Originariamente inviato da senise
    E' possibile, in caso di riallocazione del vector, ottenere un puntatore non valido?
    Questo codice secondo voi è sicuro?
    Che cos'è vector? ch cos'è A? Cosa intendi per "riallocazione"?
    Cerca di ridurre ai minimi termini ed in modo il riproducibile il tuo problema.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151

    Re: Re: [ c++ ] Puntatore ad un vector<Classe>

    Originariamente inviato da MacApp
    Che cos'è vector?
    La domanda mi sembra chiara

    codice:
    class A
    {
     ...
    };
    
    std::vector<A>* variabile = new std::vector<A*>();
    Originariamente inviato da MacApp
    ch cos'è A?
    A è una classe qualunque.

    Originariamente inviato da MacApp
    Cosa intendi per "riallocazione"?
    Quando uno std::vector raggiunge una certa dimensione, può essere riallocato in un'altra zona di memoria da parte dalla libreria standard.
    La domanda è: se il vector viene riallocato da parte della libreria standard in seguito ad operazione come insert() ed erase() il puntatore è ancora valido?

    Originariamente inviato da MacApp
    Cerca di ridurre ai minimi termini ed in modo il riproducibile il tuo problema.
    Nel post ho specificato che tutto funziona.

  4. #4

    Re: Re: Re: [ c++ ] Puntatore ad un vector<Classe>

    Originariamente inviato da senise

    La domanda è: se il vector viene riallocato da parte della libreria standard in seguito ad operazione come insert() ed erase() il puntatore è ancora valido?
    viene, eventualmente, riallocato (invalidando gli iteratori, riferimenti e puntatori precedentemente acquisiti agli elementi del vettore stesso) il puntatore interno a vector, non il puntatore che ti è stato restituito da new.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151
    MacApp

    viene, eventualmente, riallocato (invalidando gli iteratori, riferimenti e puntatori precedentemente acquisiti agli elementi del vettore stesso) il puntatore interno a vector, non il puntatore che ti è stato restituito da new.
    Grazie per la risposta.
    Non capisco però come fa il puntatore al vettore ad essere ancora valido in caso di riallocazione. Se il vector viene spostato in una nuova zona della memoria, il vecchio puntatore potrebbe avere un indirizzo non corretto.

  6. #6
    Il vector non si sposta, è il puntatore alla memoria contenuto al suo interno a cambiare al momento della riallocazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da senise
    Grazie per la risposta.
    Non capisco però come fa il puntatore al vettore ad essere ancora valido in caso di riallocazione. Se il vector viene spostato in una nuova zona della memoria, il vecchio puntatore potrebbe avere un indirizzo non corretto.
    Il puntatore a std::vector che hai memorizzato in "variabile" (quello che ti viene restituito da new) NON viene riallocato.
    Quello che viene eventualmente alla bisogna riallocato è un membro dell'oggetto std::vector puntato da "variabile".

  8. #8
    Originariamente inviato da MItaly
    Il vector non si sposta, è il puntatore alla memoria contenuto al suo interno a cambiare al momento della riallocazione.
    intendi che gli elementi contenuti nel vector potrebbero anche non essere consecutivi in memoria?

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151
    Il vector non si sposta, è il puntatore alla memoria contenuto al suo interno a cambiare al momento della riallocazione.
    Ok, credo che il funzionamento sia chiaro.
    Dunque verrebbe invalidato un eventuale puntatore ad un oggetto interno, ma non il puntatore al vector.

    Vi ringrazio per tutte le risposte

  10. #10
    No, gli elementi contenuti nel vector devono* essere consecutivi in memoria; un oggetto vector di fatto è (semplificando) una scatola contenente un puntatore alla memoria contigua allocata per gli elementi, un size_t contenente il numero di elementi effettivamente memorizzati e un size_t contenente il numero di elementi che può contenere la memoria allocata. Quando bisogna riallocare la memoria (perché è stato richiamato push_back, insert, ... e non è rimasto abbastanza spazio nella memoria allocata, o quando succede una situazione analoga con reserve) il vector alloca nuova memoria, copia il contenuto del vecchio array dinamico nella nuova memoria, lo dealloca e quindi memorizza nel suo puntatore interno l'indirizzo della nuova memoria.


    * tu, si, proprio tu che stai per puntualizzare che nello standard C++98 ciò non è specificato, ma è specificato solo che l'accesso ad un elemento qualunque avviene in tempo costante, sì, proprio tu che stai anche per dire che in un TR è stato aggiunto anche questo requisito: ecco, come vedi lo so già e quindi non dirmelo.
    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.