2017-12-14 1 views
0

Meistens ist klar, wo Speicher in WT 3 freigegeben ist (sehr explizit in WT 4), aber in diesem Fall verstehe ich die Logik nicht.Wt 3 Speicherfreigabe

Der folgende Funktionsinhalt setzt einen Container für meine wt 3-Anwendung. Alles funktioniert gut, aber könnte irgendjemand erklären, wie man (oder sollte das) zurückkommen soll?

_content wird als private Klassendaten gespeichert.

Wt::WContainerWidget* _content; 

Funktionsinhalt() Griffe Behälter

Wt::WContainerWidget* web::content() 
{ 
    if (_content == 0) { 
     _content = new Wt::WContainerWidget(root()); //memory allocation 
    } 
    return _content; //allocated memory gets returned 
} 

später wird diese verwendet wie:

void web::sayhi() 
{ 
    content()->addWidget(new Wt::WBreak()); 
    content()->addWidget(new Wt::WText("hello world")); 
} 

Wie dies durch Inhalt zurückzugewiesenen Speicher löschen/handhaben ist annehmen()

Antwort

2

Wenn Sie diese Form des Konstruktor erkunden:

_content = new Wt::WContainerWidget(root()); 

Dann wird das Widget root() als Kind hinzugefügt, so ist es im Besitz von root(). _content ist in diesem Fall tatsächlich nicht besitzend.

Also, wenn die WApplication zerstört ist, wird die root() und jedes Kind von root() damit zerstört.

Dies entspricht dies in Gew tun 4:

_content = root()->addWidget(std::make_unique<Wt::WContainerWidget>()); 

oder kürzer (seit Wt 4.0.1):

_content = root()->addNew<Wt::WContainerWidget>(); 
+0

Ich dachte so eine Zauberei geht weiter, vielen Dank. Ich verstehe nicht wirklich, wie root() das so übernehmen kann :( – Levi

+0

Im Konstruktor von 'WWebWidget' und' WCompositeWidget' wird 'parent-> addWidget (this)' aufgerufen. Dies erfordert sorgfältige Programmierung, obwohl 'this' zu diesem Zeitpunkt immer noch ein 'WWebWidget' oder' WCompositeWidget' anstelle eines bestimmten Widgets ist, sollte sich 'addWidget' nicht auf irgendwelche speziellen Eigenschaften des konkreten Widgets verlassen. Wegen der auftretenden Probleme Aus diesem Grund und weil es nicht mit der Verwendung von "unique_ptr" kompatibel ist, ist dies in Wt 4 nicht mehr möglich. – RockinRoel

0

Sie sollten Inhalt als Variablenelement speichern, das nach Wert anstelle eines Zeigers gespeichert wird. Wenn Sie Inhalte als Zeiger halten muss dann können Sie die Verwendung von Smart-Pointer (std :: unique_ptr oder std :: shared_ptr)

+0

Das ist natürlich groß sein würde, aber es scheint, es funktioniert nicht so arbeiten. Gegeben Fehler ist wie folgt: konnte nicht konvertieren '((web *) this) -> web :: _ content' von 'Wt :: WContainerWidget *' zu 'std :: unique_ptr ' – Levi

Verwandte Themen