Objekte werden gelöscht?
-
Hallo, ich beschäftige mich (mal wieder) mit C++ und bin da auf ein Problem gestoßen. Ich hoffe Ihr könnt mir da helfen. (Sry für den komischen Titel, aber mir ist nichts besseren eingefallen.)
Ich habe eine Hauptroutine und zwei Objekte, wobei das erste Objekt eine Routine besitzten soll, der man einen String übergeben muss. Anhand diesen Strings, soll das Objekt ein zweites Objekt starten. Eine zweite Routine im ersten Objekt leitet dann einfach die Anfrage weiter zum zweiten Objekt, welches noch geladen ist. Mein Problem ist jetzt, dass er das zweite Objekt anscheinend nicht im Speicher behält.
die Hauptroutine sieht so aus (das ganze ist in Qt realisiert, aber ich denke das sind Basics, darum in diesem Forum):
Hauptroutine.cpp
object1* o1 = new object1(this); o1->setOption("eins");
Das erste Objekt sieht so aus:
Object1.cpp:
object1::object1(QObject* parent) : QObject(parent) { } void object1::setOption(const QString option) { if (option == "eins") { object2* o2 = new object2(this); } } void object1::routine() { o2->irgendwas(); }
Da ich die Objekte mit new anlege, dachte ich eigentlich dass sie im Heap landen und somit erst gelöscht werden, wenn das Programm beendet wird oder ich delete aufrufe, aber anscheinend habe ich da noch einen Denkfehler. Kann mir jemand erklären was ich falsch mache? Danke.
-
Das stimmt zwar, aber du erzeugst den Pointer auf das Objekt lokal. Somit hast du keine Möglichkeit mehr, auf den Speicher zuzugreifen. Pack dir den Pointer doch einfach als Member in deine Klasse.
Übrigens gehört zu jedem new auch ein delete, sonst produzierst du ein Speicherleck.
-
_matze schrieb:
Das stimmt zwar, aber du erzeugst den Pointer auf das Objekt lokal. Somit hast du keine Möglichkeit mehr, auf den Speicher zuzugreifen. Pack dir den Pointer doch einfach als Member in deine Klasse.
Danke. Dummer Fehler meinerseits. Ich wusste es doch xD
_matze schrieb:
Übrigens gehört zu jedem new auch ein delete, sonst produzierst du ein Speicherleck.
Macht QT das nicht automatisch, wenn ich das Programm schließe?
-
K4m1K4tz3 schrieb:
Macht QT das nicht automatisch, wenn ich das Programm schließe?
Gegenfrage: Und wenn Du das Programm nicht schließt?
(Bei mir läuft der Rechner, und damit z.B. der Browser, 24/7 durch. Ich würde mich beschweren, wenn der mir alle paar Tage den RAM zuknallen würde)
-
wenn ein Widget in Qt geschlossen wird, loescht es automatisch alle anderen Objekte, die als Kindelemente eingetragen sind.
Wenn man ein Objekt manuell loeschen will darf man halt keinen parent-Zeiger mitgeben. Sonst kuemmert sich eben dieser parent ums deleten und wird relativ ungehalten, wenn man ihm seine Kinder ungefragt wegnimmt
-
Ok danke, habs kapiert
-
Noch ein kleines Beispiel: Ich habe mal eine Bildschirmlupe geschrieben, die in einer frühen Version ständig Screenshots vom Desktop gemacht hat. Ein lustiges Speicherleck hat dafür gesorgt, dass pro OnMouseMove ein Screenshot (ca. 5MB, glaube ich) im Speicher zurückgeblieben ist. Rate mal, wie schnell da auch 2 oder 3 GB RAM voll sind!
-
_matze schrieb:
Noch ein kleines Beispiel: Ich habe mal eine Bildschirmlupe geschrieben, die in einer frühen Version ständig Screenshots vom Desktop gemacht hat. Ein lustiges Speicherleck hat dafür gesorgt, dass pro OnMouseMove ein Screenshot (ca. 5MB, glaube ich) im Speicher zurückgeblieben ist. Rate mal, wie schnell da auch 2 oder 3 GB RAM voll sind!
Ich hoffe mal, dass du den Fehler behoben hast.
-
drakon schrieb:
_matze schrieb:
Noch ein kleines Beispiel: Ich habe mal eine Bildschirmlupe geschrieben, die in einer frühen Version ständig Screenshots vom Desktop gemacht hat. Ein lustiges Speicherleck hat dafür gesorgt, dass pro OnMouseMove ein Screenshot (ca. 5MB, glaube ich) im Speicher zurückgeblieben ist. Rate mal, wie schnell da auch 2 oder 3 GB RAM voll sind!
Ich hoffe mal, dass du den Fehler behoben hast.
Hehe, klar. Ich sprach ja nur von einem frühen Zwischenstand. Das war quasi mein WinAPI-Einstieg. Die Lupe war am Ende sogar ganz gut (und natürlich Leck-frei
), und ich nutze sie regelmäßg auf der Arbeit. Mittlerweile wird sie auch über ein Tray-Icon aktiviert und es wird logischerweise nur ein Screenshot pro Aktivierung erzeugt, aus dem dann das Teilbild kommt, dass man im Lupenfenster sieht.
-
Das nimmt mich jetzt aber Wunder. Gibts das auch zum Download?
-
Meines Wissens ist so was bei Windows standard-mäßig mit dabei ^^
-
unskilled schrieb:
Meines Wissens ist so was bei Windows standard-mäßig mit dabei ^^
Joa, schon klar, aber ich wollte hald seine Version mal anschauen. Ich teste noch gerne neue Sachen, auch wenn sie es schon tausendmal gibt.
Ich werds mit 99% Wahrscheinlichkeit innerhalb von 10 Minuten wieder löschen, aber das hat nichts mit dem Programm zu tun, sonder einfach, dass, wenn ich es länger behalten würde bereits so viel Zeugs meine Platte verpessten würde.
-
drakon schrieb:
Das nimmt mich jetzt aber Wunder. Gibts das auch zum Download?
Hmm, da müsste ich erst mal nachfragen. Das hab ich ja auf der Arbeit geschrieben (also Nutzungsrecht bei der Firma). Einen Nutzen hat das für die Firema aber nicht. Insofern könnte das klargehen. Mal sehen...
P.S.: Die Windows-Lupe ist insofern eingeschränkt, als dass man ja nur diesen "Vergrößerungsstreifen" am oberen Bildschirmrand hat und seinen sichtbaren Bereich damit einschränkt. Nicht so toll... Meine Version orientiert sich eher an der Giga-Lupe, falls die einer kennt.
-
Wozu benötigt man sowas? Wenn man etwas nicht erkennen kann, kann man doch auch die Auflösung runterstellen
-
It0101 schrieb:
Wozu benötigt man sowas? Wenn man etwas nicht erkennen kann, kann man doch auch die Auflösung runterstellen
Genau. Und das dauert dann 5 Minuten, bis man das eingestellt hat und wieder zurück.
Ich denke schon, dass man es brauchen kann, wenn man hald ne riesige Auflösung hat und etwas klein geschrieben ist. Allerdings braucht man das im Browser nicht und auch sonstige Editore/Programme beinhalten meistens auch eine Art Zoom Funktion.
-
Auch ist das eventuell eine sinnvolle Hilfe für sehbehinderte Menschen, die ständig alles vergrößern müssen, um im Windows-Alltag klarzukommen. Auch, wenn das jetzt nicht meine Intention war. Ich brauchte einfach ein kleines Projekt zum Einstieg in die Windows-Programmierung und hab mir dann vorgenommen, die Giga-Lupe nachzubilden.