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

    [c++]costruttore di copia e smart pointers

    ciao.
    Devo creare un costruttore di copia per una classe della mia appplicazione , o dei puntatori e sarebbe per questo che implemementerei il costruttore di copia , per non fare puntare tutti e due i puntatori copiato e originale allo stesso indirizzo (sbaglio?).

    Il problema è che non ho dei puntatori normali , ho degli smart pointers , come ci si comporta in questo caso ?
    si puo' utilizzare un solo smart pointer per ogni puntatore senza allocare un altro puntatore?
    Pensavo che lo smart pointer gia di perse' incrementa il reference counter dopo l'operazione = come se ci fosse un altro puntatore allocato.
    E' corretto allora?
    pecca il ragionamento?
    sbaglio?

    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In caso di smart pointer (quali?) il costruttore di copia ti serve soltanto se intendi implementare la deep copy, cioè la creazione ex novo di un oggetto che sia la copia reale di un oggetto.
    Di solito gli smart pointer si limitano a incrementare un contatore, ma la memoria puntata è la stessa. Se vuoi differenziare le zone di memoria, devi provvedere a mano.
    Se invece non ti interessa la deep copy, non ti serve il costruttore di copia. Il compilatore richiamerà "automagicamente" quello dello smart pointer e di eventuali altri oggetti che implementano a loro volta il costruttore di copia (il cui fine ultimo, in fondo, è sollo quello di gestire i puntatori raw ed evitare loro una duplice delete).
    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,
    un altra domandina :
    ho capito il discorso della non necessità del costruttore di copia e smartpointers, ma ho un problema:
    Io identifico la deep copy e la sua necessità proprio con la distruzione del raw pointer che senza la deep copy potrebbe esssere distrutto 2volte con errore.
    Quando è necessaria la deep copy utilizzando gli smart pointer?
    ad es quando i due puntatori possono essere cambiati di valore successivamente indipendentemente ,penso ,io pero' non ho questa necessità tant è che il raw pointer dello smart pointer deve solo puntare ad un valore uguale per la copia e per l'originale e non essere distrutto due volte.
    si puo fare qualcosa con i const sullo smart pointer in questo caso per assicurarmi di questo.

    ps.gli smart pointers sono smart pointers di un applicazione creati ad hoc per essa.
    sono intrusivi.
    ne ho visti parecchie nei programmi opensource di questa implementazione, ad es un oggetto pointer che gestisce il reference counter e la distruzione.
    chiaramente derivando da pointer ....
    Sono meglio o offrono di piu'ad es gli smart pointers shared del tr1 o di boost?
    grazie.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da giuseppe500
    Quando è necessaria la deep copy utilizzando gli smart pointer?
    ad es quando i due puntatori possono essere cambiati di valore successivamente indipendentemente
    Ti sei risposto da solo. Un altro esempio è il copy on write. PIù in generale, la deep copy la usi quando vuoi avere due "veri" oggetti e non solo uno "refereinziato".

    ,penso ,io pero' non ho questa necessità tant è che il raw pointer dello smart pointer deve solo puntare ad un valore uguale per la copia e per l'originale e non essere distrutto due volte.
    si puo fare qualcosa con i const sullo smart pointer in questo caso per assicurarmi di questo.
    Allora il problema non si pone: usa gli smart pointer e vivi tranquillo. Per inciso, se il distruttore di una classe è accessibile (pubblico), il const non impedisce la delete su un raw pointer.

    ps.gli smart pointers sono smart pointers di un applicazione creati ad hoc per essa.
    sono intrusivi.
    ne ho visti parecchie nei programmi opensource di questa implementazione, ad es un oggetto pointer che gestisce il reference counter e la distruzione.
    chiaramente derivando da pointer ....
    Sono meglio o offrono di piu'ad es gli smart pointers shared del tr1 o di boost?
    A naso gli intrusive pointer dovrebbero essere più veloci, ma solo perché non allocano strutture interne. Lo svantaggio è possono essere applicati solo a oggetti user defined (i tuoi ad esempio) e non a tipi semplici o STL (come fai a mettere una funzione intrusiva su un int o un vector?). Inoltre possono avere problemi col multithreading.
    Credo ci sia una ragione di fondo perché lo standard non li menzioni.
    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.

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.