2015-01-22 8 views
5

Beispielcode:Müssen Sie QValidator manuell löschen?

QDoubleValidator *validator = new QDoubleValidator(); 
myInputLineEdit->setValidator(validator); 

// delete validator; 

Hinweis: myInputLineEdit ist ein QLineEdit Zeiger und wird mit ihrer Mutter gelöscht werden.

Meine Frage ist, wann sollte ich Validator löschen, wie es manuell erstellt wird und setValidator() scheint nicht den Besitz dieses Zeigers gemäß der Dokumentation zu übernehmen? Wenn ich es nicht lösche, wird es ein Speicherleck sein?

Ich habe versucht, es gleich danach zu löschen, wie der kommentierte Code, und ich bemerkte, dass der Validator von myInputLineEdit danach 0 wurde. Ich denke also, ich muss es löschen, nachdem myInputLineEdit gelöscht wurde.

Ein anderer Gedanke ist, ich könnte Validator ein Elternteil geben, so dass es zusammen mit seinem parrent gelöscht wird, ist das ein guter Weg, das zu tun? Was, wenn es keinen guten Kandidaten gibt, der Elternteil zu sein?

Dank

+1

Wenn Sie sich für den Grund interessieren, warum 'setValidator' keine Eigentumsrechte übernimmt, liegt das wahrscheinlich daran, dass Sie denselben Validator für mehrere Eingabe-Widgets verwenden können.Aber QObjects haben keinen gemeinsamen Besitz, sondern stattdessen * unique * parent-ownership, also müssen Sie den Elternteil auf * some * widget setzen (entweder die Zeile bearbeiten oder ein Elternteil davon, was am meisten Sinn macht). – leemes

Antwort

6

Ich versuchte es direkt nach dem zu löschen, wie der kommentierten Code, und ich bemerkte der Prüfer von myInputLineEdit das wurde 0 nach. So denke ich, dass ich löschen muss, nachdem myInputLineEdit gelöscht wurde.

Es ist, weil QLineEditQPointer intern verwendet, welche Spuren QValidator Objekt, wenn es gelöscht wurde.

und setValidator() scheint nicht das Eigentum an diesen Zeiger entsprechend der Dokumentation

setValidator() in der Tat nicht gesetzt Eltern von QValidator zu nehmen.

Ein anderer Gedanke ist, kann ich Validator einen Elternteil geben, damit es zusammen mit seiner parrent gelöscht wird, dann ist dies ein guter Weg, das zu tun? Was ist, wenn kein guter Kandidat als Elternteil vorhanden ist?

Sie können entweder manuell löschen, intelligente Zeiger verwenden oder tun wie @crayzeewulf sagte - gesetzt myInputLineEdit als Elternteil (mit QValidator Konstruktor oder setParent()). Parent kümmert sich darum, seine untergeordneten Elemente zu löschen. Es ist also ein Weg zu gehen. Normalerweise ist das Objekt, dem der Validator zugewiesen ist, ein gutes Elternobjekt.

Wenn ich es nicht lösche, wird es ein Speicherleck sein?

Wenn Sie weder einen übergeordneten Eintrag festlegen noch ihn löschen, tritt ein Speicherverlust auf.

+0

Danke Jungs. Ich habe myInputLineEdit nicht als übergeordnetes Element verwendet, da ich diesen Validator für mehrere QLineEdit-Objekte verwenden möchte, wie von @leemes erwähnt. Es wird also ein Problem geben, wenn einer von ihnen gelöscht wird. Ich denke, ich habe hier zwei Möglichkeiten: 1, Creator einen Validator für jeden QLineEdit; 2, da alle diese QLineEdit-Objekte Mitglieder einer gemeinsamen Klasse sind, die auch eine QObject-Klasse ist, kann ich sie als Eltern verwenden. – vlursk

+0

@Leo Gehen Sie mit der Option 2. – thuga

2

Verwenden mInputLineEdit als parent von validator wie im Beispiel here. Der Destruktor eines Elternteils zerstört alle untergeordneten Objekte (siehe this). Dies ist die "Art und Weise" der Handhabung von ownership trees.

Verwandte Themen