Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [c++]smart pointer

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]smart pointer

    ciao.
    Sto utilizzando una libreria di un engine 3d.
    Utilizza gli smart pointers.
    Gli smart pointer da quello che ho capito sono intrusivi(scusate se non conosco bene i termini , al limite correggetemi), ho una classe base CObject da cui derivano tutte le classi grafiche , e questa classe base ha un counter reference.
    Quando assegno un puntatore si incrementa , quando invece il puntatore esce dalla visibilità decrementa il contatore.
    Se assegno in qualsiasi punto del programma lo smart pointer a 0 decrementa il counter reference
    Se il contatore arriva a 0 l'oggetto si cancella con un delete.
    Ora.
    1)Non riesco a capire a cosa serve questo comportamento penso per condividere i dati senza eseguire delete che si riversano su altre parti del codice dove è utilizzato quello smart pointer ed evitare cancellazioni di un puntatore non valido?
    2)se devo assegnare lo smart pointer a 0 in tutti i punti dove è stato assegnato lo smart pointer per cancellarlo completamente alla fine , dove sta la comodità?
    3)gli smart pointer shared_ptr di boost si comportano cosi? esiste una funzione che cancella completamente lo smart pointer senza pensare ai riferimenti?

    grazie e scusate la confusione.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Gli smart pointer da quello che ho capito sono intrusivi(scusate se non conosco bene i termini , al limite correggetemi), ho una classe base CObject da cui derivano tutte le classi grafiche , e questa classe base ha un counter reference.
    Gli smart pointer son intrusivi se e solo se il counter reference è all'interno della classe gestita. Nel tuo casono sono di titpo intrusive, ma gli shared_ptr non sono intrusivi. Esistono poi altre variazioni sul tema come gli smart pointer ciclici basati su liste (Loki mi pare ne abbia uno), oppure smart pointer con possesso esclusivo (std::unique_ptr ad esempio).

    1) Esatto. L'idea di fondo è di evitare un doppio delete con esiti catastrofici.

    2) E perché dovresti farlo? Sarà "smart" per qualcosa no?

    3) Puoi invocare il metodo reset() senza argomenti. Comunque nel caso degli shared_pointer puoi usare quelli forniti dal compilatore ( VC++ 2008 sp1 e VC++ 2010 hanno la loro implementazione).
    Quelli di boost (che hanno dato l'incipit) tra un pò saranno solo per compatibilità con codice che già ne fa uso e non si vuole più toccare.
    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
    Jun 2003
    Messaggi
    4,826
    grazie shodan.
    Il fatto è che ho creato una factory che crea degli smartpointer e li passa fuori dal factory method.
    codice:
    class CMeshFactory{
    MeshPtr getMesh(int nTypeMesh)
       { 
       switch(nTypeMesh)
       {
           case SPHERE:
          {
             MeshPtr pPtr = new Mesh();
             .
             .
             .
            return pPtr;
          }
    
       }
    }
    //chiamati da una funzione che ha un istanza della classe CMeshFactory
    MeshPtr pMesh = pFactory->getMesh(SPHERE);
    pMesh ha un referece counter di 2!
    non dovrebbe essere 1?
    perchè?

    Io ho "risolto" decrementando forzatamente il reference counter ma è una soluzione "accrocchiata" in modo che la mesh creata abbia un ref counter di 1, dato che l'ho appena istanziata.
    E' un comportamento corretto?
    grazie.

  4. #4
    Originariamente inviato da giuseppe500


    MeshPtr pMesh = pFactory->getMesh(SPHERE);
    pMesh ha un referece counter di 2!
    non dovrebbe essere 1?
    perchè?

    Io ho "risolto" decrementando forzatamente il reference counter ma è una soluzione "accrocchiata" in modo che la mesh creata abbia un ref counter di 1, dato che l'ho appena istanziata.
    E' un comportamento corretto?
    grazie.
    A prima vista NON sembra corretto (ma non conosco i MeshPtr eh). In ogni modo giusto per essere certo fatti un programmino di test, e dovresti verificare subito il corretto comportamento. Nel tuo caso potrebbe anche darsi che il refconter sia 2, perché incrementato altrove, nel tuo codice, oppure in un altro thread.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Concordo con MacApp. Nel codice sia di Wm4Object sia in Wm4SmartPointer (stai usando questa versione, vero? Non la Wm5) non c'è niente che giustifichi quel comportamento. Tra l'altro non dici nemmeno come fai a sapere che il counter vale 2 (lo vedi da debug o stampando il valore tramite GetReferences()? )
    Tra l'altro il counter non è atomico quindi quello smart pointer non è adatto in ambiente multithreading (anche se dovrebbe centrare poco visto che lo smart pointer è creato in una funzione).
    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.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    oppure

    se adotti il multithreading ti conviene usare un mutex

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.