Domanda

Venendo dal mondo Symbian, sono abituato ad usare il cumulo per quanto possibile, per evitare di esaurire lo spazio di stack, in particolare durante la manipolazione dei descrittori. CBase deriva classi sono state sempre allocati dinamicamente sul mucchio, in quanto se non lo fossero, le variabili membro sarebbe rimasto non inizializzata. Ha la stessa convenzione si applica alle classi QObject-derivate?

In Qt sembra essere comune a mettere, per esempio QString, sullo stack. Sono i contenuti della stringa immessi sul mucchio, mentre QString funge da contenitore in pila, o è tutto messe in pila?

È stato utile?

Soluzione

Come sje397 ha detto: E 'idiomatica mettere QString e contenitori in pila, in quanto sono implicitamente condivisi. I loro interni (Pimpl "d" puntatore) vengono creati sul mucchio. Non v'è alcun punto nella creazione dell'oggetto stesso sul mucchio, anche. Provoca solo problemi di gestione della memoria e si perde le proprietà di copy-on-write destinati quando passa puntatori a stringhe / contenitori intorno.

QObjects d'altra parte che si desidera creare sul mucchio in quasi tutti i casi, come altrimenti sarebbero distrutti di nuovo subito. Essi non possono essere copiati o assegnati (beh, si può applicare per proprie sottoclassi, ma la semantica QObject sono rotti quindi), e di solito si suppone per sopravvivere il corpo del metodo in cui vengono creati in. Eccezione è QDialog, che spesso si crea in pila, seguito da QDialog::exec, che blocca finché la finestra è chiusa. Ma anche questo è strettamente parlato non sicuri, come gli eventi esterni (chiamate RPC, operazioni in background) potrebbe causare la finestra da eliminare dal suo genitore (se il genitore stesso viene eliminato) prima del ritorno di exec. Poi avendo la finestra di dialogo creata in pila causerà doppia eliminazione mentre si svolge la pila -> crash.

Altri suggerimenti

QString, e molte altre classi Qt, utilizzare implicita condivisione dei dati . Ciò implica che la memoria è generalmente allocata sul mucchio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top