Memorizzazione dynamic Deallocation in QT

Come vengono distrutti i puntatori allocati dynamicmente nella codifica QT perché non scriviamo per loro un distruttore specifico?

Per espandere la risposta di Neox , Qt ha due metodi per la gestione degli oggetti:

  1. QObject struttura ad albero
  2. Classi di puntatori gestite

E i due non si mescolano molto bene per ragioni che diventeranno evidenti.

QObject può essere ‘libero’ o avere un genitore. Quando un QObject ha il suo set genitore (fornendo il costruttore QObject con un puntatore a un altro QObject, o chiamando setParent() ) il QObject padre diventa il proprietario del QObject figlio e si assicurerà che tutti i suoi figli vengano distrutti quando esso è. Ci sono anche diversi metodi disponibili per ispezionare le relazioni bambino / genitore.

Un metodo separato di gestione degli oggetti allocati dynamicmente sono le classi di puntatore gestite che questo documento spiega abbastanza bene. Per riassumere però:

  • “La class QScopedPointer memorizza un puntatore a un object allocato dynamicmente e lo elimina dopo la distruzione” ed è quindi utile quando hai bisogno di oggetti che hanno una proprietà e una durata chiare ed evidenti.
  • “La class QSharedPointer ha un forte riferimento a un puntatore condiviso [e] cancellerà il puntatore che tiene quando esce dall’ambito, a condizione che nessun altro object QSharedPointer faccia riferimento a esso” ed è quindi buono quando la proprietà non è così chiara, ma vuoi assicurarti che non si perda e diventi una perdita di memoria. QWeakPointer può essere utilizzato per condividere il puntatore senza implicare alcuna proprietà.

Come puoi vedere, alcune delle classi di puntatori custodite possono essere utilizzate con un albero QObject, ma devi assicurarti di leggere e comprendere a fondo la documentazione prima di farlo o potresti finire con una struttura dati corrotta.

La risposta breve è:

QObjects si organizzano in alberi di oggetti. Quando crei un object QObject con un altro object come genitore, viene aggiunto all’elenco dei figli () del genitore e viene eliminato quando il genitore è.

Qt ha un buon documento sulla gerarchia degli oggetti e la proprietà all’interno del framework. Puoi leggerlo qui