Vai al contenuto


Foto

[Qt/C++] Gestione Memoria


Questa discussione e' stata archiviata Questo significa che non e' possibile rispondere
51 risposte a questa discussione

#1 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 20 luglio 2011 - 16:22

leggo in giro che

Qt maintains hierarchies of objects. For widgets (visible elements) these hierarchies represent the stacking order of the widgets themselves, for non-widgets they merely express "ownership" of objects. Qt deletes child objects together with their parent object. While this takes care of 90% of memory handling problems it also brings some challenges and leaves a few aspects open.



quindi per esempio, se istanzio un QWidget o QDialog, nel momento in cui vado a fare la delete di questi, viene automagicamente chiamata anche la delete della roba istanziata nello heap dentro al QWidget / QDialog?

Sul serio? :look:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#2 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 20 luglio 2011 - 17:35

quante ferie fa trallallero?

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#3 Killer application

Killer application

    Schiavo

  • GRULLINO
  • 11.918 Messaggi:

Inviato 20 luglio 2011 - 20:11

passa al java.

Noi abbiamo il garbage collector. :D


e i cookies. :)
Immagine inserita

#4 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 21 luglio 2011 - 00:52

Ok chiedo su HTML.it, cancellate pure il topic

Mio ultimo post d'ora in poi lurkeró e basta

cit.


:D

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#5 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 23 luglio 2011 - 00:11

Le QT non sono magiche, eh.
Si occupano della loro memoria, non della tua.

Se è un problema, passa a Java. :alone:
In Soviet Italy, the evil army owns you!

#6 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 04 agosto 2011 - 13:34

Le QT non sono magiche, eh.
Si occupano della loro memoria, non della tua.

Se è un problema, passa a Java. :)


il prossimo progetto, il più grosso della laurea, è (molto probabilmente) in java. Intanto smettila :)


Per tralla:

esempio:
ho una classe
class IscrDialog: public QDialog

nel costruttore ho tipo dei

QVBoxLayout* v1= new QVBoxLayout(this);

    QFormLayout* f1= new QFormLayout();

poi anche altre cose, ma intanto volevo capire questo:

vengono deallocati v1 e f1 quando chiudo la finestra? sì tutti e 2/solo v1 perchè come padre gli passo this/nessuno dei due e devo ricordarmi di distruggerli nel distruttore?



Cioè in pratica devo capire meglio questo

Qt maintains hierarchies of objects. For widgets (visible elements) these hierarchies represent the stacking order of the widgets themselves, for non-widgets they merely express "ownership" of objects. Qt deletes child objects together with their parent object. While this takes care of 90% of memory handling problems it also brings some challenges and leaves a few aspects open.


grazie :)

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#7 Guest__*

Guest__*
  • Ospiti

Inviato 04 agosto 2011 - 13:37


System.gc();


...any problems? :) ...

#8 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 04 agosto 2011 - 13:40

Se ovunque, nel programma qt, fai una new di oggetti tuoi senza dargli come parent un oggetto di qt, poi sta a te eliminarlo.
Se crei un oggetto qt e nel costruttore gli passi this come parent, ci pensa qt poi ad deletarlo.

Comunque per tutto il resto boost share pointers wtf :)
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#9 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 04 agosto 2011 - 13:43

Ah, dimenticavo, il java lascialo ai ritardati :)

(giusto per dare un po di audience al thread)
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#10 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 04 agosto 2011 - 13:46

Se ovunque, nel programma qt, fai una new di oggetti tuoi senza dargli come parent un oggetto di qt, poi sta a te eliminarlo.
Se crei un oggetto qt e nel costruttore gli passi this come parent, ci pensa qt poi ad deletarlo.

Comunque per tutto il resto boost share pointers wtf :)



si ok però nell'esempio che ti ho messo, con i Q*Layout, non posso dare this a f1, mi dà errore in quanto mi dice che esiste già un layout per questo widget.
quindi in questo caso è "obbligatorio" che metta la delete nel distruttore giusto?

Also, il distruttore viene invocato quando c'è l'evento exit?

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#11 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 04 agosto 2011 - 13:51

@[/url]":1c07kbw1] Se ovunque, nel programma qt, fai una new di oggetti tuoi senza dargli come parent un oggetto di qt, poi sta a te eliminarlo.
Se crei un oggetto qt e nel costruttore gli passi this come parent, ci pensa qt poi ad deletarlo.

Comunque per tutto il resto boost share pointers wtf :)



si ok però nell'esempio che ti ho messo, con i Q*Layout, non posso dare this a f1, mi dà errore in quanto mi dice che esiste già un layout per questo widget.
quindi in questo caso è "obbligatorio" che metta la delete nel distruttore giusto?

Si. Come scritto nella documentazione, qt ha bisogno di conoscere la gerarchia degli oggetti per poter poi deletare tutto nel modo giusto. Se crei un oggetto ma non dici a qt di chi è figlio, lo devi cancellare da solo.

Also, il distruttore viene invocato quando c'è l'evento exit?

Direi di si. Ma per essere sicuro dovresti controllare la gestione eventi/signals di qt.
Sai come funziona no ? signal/connect/event e via dicendo...
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#12 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 04 agosto 2011 - 13:53

Ma perché dovresti chiamare exit() ? solo in caso di errore immagino.
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#13 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 04 agosto 2011 - 13:54


Si. Come scritto nella documentazione, qt ha bisogno di conoscere la gerarchia degli oggetti per poter poi deletare tutto nel modo giusto. Se crei un oggetto ma non dici a qt di chi è figlio, lo devi cancellare da solo.


ah ok. Quindi devo stare attento a tutti i layout "annidati". Oppure fare un widget per ogni layout ma sarebbe un po' uno scazzo, avrei over 9000 classi.


Direi di si. Ma per essere sicuro dovresti controllare la gestione eventi/signals di qt.
Sai come funziona no ? signal/connect/event e via dicendo...


:) , molto figa :)

Grazie intanto

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#14 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 04 agosto 2011 - 13:56

Ma perché dovresti chiamare exit() ? solo in caso di errore immagino.



non viene chiamato exit() quando chiudo la finestra? L'ho anche ridefinito e funziona, spe che controllo.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#15 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 04 agosto 2011 - 13:57

ah no sono scemo, intendevo CloseEvent(), difatti ho cosato così

void LegamiGui::closeEvent(QCloseEvent *event)

 {

    db->salva();

    event->accept();





 }


eh ho fatto un po' di ferie in mezzo al progetto :)

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#16 Guest__*

Guest__*
  • Ospiti

Inviato 04 agosto 2011 - 14:00

Ah, dimenticavo, il java lascialo ai ritardati :)

(giusto per dare un po di audience al thread)



...java calza le mie esigenze di basso QI richiesto...

#17 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 04 agosto 2011 - 14:01

Ovviamente do per scontato che tu intenda QApplication::exit(0) e non la funzione C exit() (se poi qt abbia dei signal catcher e chiami i distruttori anche in quel caso non so, ma è più pulito ed elegante uscire chiamando la funzione di QT).

Per il resto, come t'ho detto prima, puoi usare boost::shared_ptr.
Copincollo parte del mio codice:


boost::shared_ptr m_Jrtp; // dichiarazione

m_Jrtp.reset(new RTPWrapper::RTP_WrapperJrtplib(...); // alloca pointer

m_Jrtp->... // uso del pointer

m_Jrtp.reset(); // delete pointer ma non serve perché fatto in automatico da boost


Praticamente funziona come un garbage collector solo che non è per ritardati :)
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#18 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 04 agosto 2011 - 14:03

toyo, non voglio sapere cosa ci fai con una Legami Gui :)
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#19 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.143 Messaggi:

Inviato 04 agosto 2011 - 14:06

eh ho scritto sopra che mi ero confuso con QCloseEvent scusa.

i boost cosi sono degli smart pointers già pronti giusto?

Perché avrei anche i miei già pronti in giro.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#20 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 04 agosto 2011 - 14:10

boost è tutto un insieme di librerie C++ open, molto facile da usare e molto efficiente.
Va dalle normali string all'asio passando per threads a mutex.
Solo NON guardare il codice di boost perché se lo fai ti senti scemo.
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all