Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475

    [C++] vector di puntatori

    Ciao,

    in un programma che sto facen... provando a fa... insomma ci sto lavorando diciamo, ho molte classi che contengono dei vector di puntatori di altre classi, del tipo:

    codice:
    class B;
    
    class A
    {
        vector<B*> vec;
    }
    Al che mi viene il dubbio. Nel distruttore di A, viene chiamato anche il distruttore del vector (o mi sbaglio?), ma il distruttore del vector chiama delete sui puntatori che contiene?

    Per caso c'è un sistema più intelligente per questa cosa?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C++] vector di puntatori

    Originariamente inviato da Ippo343
    Nel distruttore di A, viene chiamato anche il distruttore del vector?
    Ni. Semplicemente il vector va fuori scope e viene distrutto, ma senza un intervento diretto del distruttore.
    ma il distruttore del vector chiama delete sui puntatori che contiene?
    No.
    Per caso c'è un sistema più intelligente per questa cosa?
    A parte un ciclo for su ogni puntatore si può fare questo:
    codice:
    template <typename T>
    struct PointerDestroyer {
        void operator()(T* p) { delete p; }
    };
    
    std::for_each( vec.begin(),vec.end(),PointerDestroyer[B]() );
    ( Quanto ci sarebbe stata bene una Lambda function qui )

    Edit:

    Dimenticavo la soluzione ottimale:
    codice:
    vector<std::tr1::shared_ptr[B] > vec;
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Uhm io sono solo un povero ignorante che ha scoperto grazie al tuo messaggio + google cos'è uno shared_ptr... ma da quello che ho letto non mi pare risolva il problema, no? Mi ritrovo ancora con il vector che viene distrutto ma non distrugge i suoi oggetti...

    Edit:

    Aspetta ma nel suo distruttore il vector chiama il distruttore dello shared_ptr (o in generale della classe che contiene)?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da Ippo343
    Aspetta ma nel suo distruttore il vector chiama il distruttore dello shared_ptr (o in generale della classe che contiene)?
    Bingo! Quando il vector fa fuori scope, chiama il distruttore di ogni singolo shared_ptr che contiene, il quale (se è l'ultimo della serie) distrugge il puntatore che contiene.
    Dico ultimo della serie perché solo uno shared_ptr distruggerà effettivamente il puntatore contenuto. Se altri shared_ptr conterranno lo stesso puntatore, decrementeranno solo un contatore interno.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Originariamente inviato da shodan
    Se altri shared_ptr conterranno lo stesso puntatore, decrementeranno solo un contatore interno.
    Il che è ottimo, nel caso che il vector vada fuori scope ma l'oggetto serva ancora ^^

    Grazie mille!
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

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