Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Destruktoren in MQL5 sind immer virtuell. Alles wird korrekt gelöscht, versuchen Sie, Print(__FUNCSIG__); in Destruktoren zu setzen.
Ich habe es in VC++ gemacht, aber ich denke, die Mechanismen zur Speicherfreigabe sind die gleichen?
Aber Ihr Beispiel wird korrekt funktionieren, da Sie nur für die Basisklasse einen virtuellen Destruktor angeben können.
Ich werde versuchen, die Idee ein wenig anders zu formulieren:
Gegeben:
Handlungen:
P.S.: die Abbildung zeigt das Speichermodell )
Zweifel, weil der Zeiger auf Klasse Nummer eins und tatsächlich im Speicher Klasse Nummer zwei. Bei Destruktoren spielt das eine Rolle, daher habe ich mich gefragt, ob es auch hier ein Problem geben könnte. Ich denke, dass in einer solchen Situation korrekte Speicherfreigabe nur passieren kann, wenn es einige Etiketten im Speicher (wie char mit Null-Terminator) oder so etwas wie das, das ist, warum ich über Speicherzuweisung gefragt.
Ihr Zweifel liegt daran, dass Sie keine Konstruktoren angegeben haben (es ist wichtig zu verstehen, was in diesem Fall passiert), versuchen Sie, dieses Beispiel auszuführen und Sie werden alles verstehen:
HZ die Konstruktion selbst sowie die Löschung ist gestaffelt, und all diese Informationen werden gespeichert (der virtuelle Zeiger selbst erinnert daran, dass die Klasse als Kompositum aus der Basis und dem Nachkommen konstruiert wurde), und beim Löschen werden die Destruktoren in umgekehrter Reihenfolge aufgerufen, vom späteren zum früheren.
Es geht nicht um Destruktoren, sondern um die Klasse selbst, genauer gesagt darum, wie viele Bytes sie belegt. Es stellt sich heraus, dass wir 200 Bytes zuweisen und mir dann sagen, dass ich den Speicher freigeben soll, auf den der Zeiger zeigt, der das Objekt mit der Größe von 100 Bytes darstellt.
Ja, der Speicherpool weiß, wie lange ein Stück Speicher durch einen Löschaufruf freigegeben wird.
Wo diese Informationen gespeichert werden, hängt von der Implementierung des Pools ab.
Wenn Sie z. B. einen Zeiger auf ein Objekt in C++ geben, das nicht durch new zugewiesen wurde, werden Sie sehen, wie Ihre Anwendung abstürzen wird.
Es geht nicht um Destruktoren, sondern um die Klasse selbst, genauer gesagt darum, wie viele Bytes sie belegt. Es stellt sich heraus, dass wir 200 Bytes zuweisen und mir dann sagen, dass ich den Speicher freigeben soll, auf den der Zeiger zeigt, der das Objekt mit der Größe von 100 Bytes darstellt.
Soweit ich weiß, hat Ihre Frage mit der Funktionsweise des Speicherpools zu tun.
Ja, der Speicherpool weiß, wie lange ein Stück durch einen Löschaufruf freigegeben wird.
Wo diese Informationen gespeichert werden, hängt von der Implementierung des Pools ab.
Wenn Sie z. B. einen Zeiger auf ein Objekt in C++ geben, das nicht über new zugewiesen wurde, werden Sie sehen, wie Ihre Anwendung abstürzen wird.