ubuntuusers.de

Frage zu Deklaration von Pointern und Variablen in GTK3

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

tom111

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo Ubuntuusers.

Habe heute eine Frage an die Programmierer unter euch. Ich bin nun schon recht weit gekommen mit dem erlernen des Programmierens unter GTK3. Aber die folgende Frage begleitet mich schon die ganze Zeit.

Wenn ich einen Pointer wie z.B. für Pixbuf innerhalb eines Funktionsaufrufes mache, oder eine Variable innerhalb eines Funktionsaufrufes erstelle, wird dann mit jedem Aufruf der Funktion ein weiterer Pointer erstellt oder die CHAR Variable erneut mit 100 Stellen erzeugt, oder werden all diese Deklarationen / Erzeugungen beim verlassen der Funktion automatisch wieder frei gegeben???

Hier nur ein Beispiel von dem was ich Beschreibe...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
void funktionsaufruf ()
{
//innerhalb eines Funktionsaufrufes...
	//Hier ist es klar...
     	gchar *variable2;	//Dieses ist nur ein Pointer und kann mit ...
     	g_free(variable2);      //...wieder verworfen/gelöscht werden.
	//Hier ist es nicht klar...
	GdkPixbuf  *pixbuf_icon1; //Weil später noch ein Bildchen hinzu kommt.
	char variable1[100];       //weil später noch ein String erzeugt wird.
	int i;			  //weil dieses für z.B. eine "for"-Schleife benötigt wird.
     	
} 	//Ende Funktionsaufruf

Wenn ich die Beispielfunktion nun 10 mal aufrufe, habe ich dann 10 mal die Variable "variable1" mit jeweils 100 Stellen erzeugt? und hat GdkPixbuf dann 10 Pointer bekommen? Oder doch nicht????

Danke für eure Hilfe. Gruß Tom

Schmutzfink

Anmeldungsdatum:
29. Juni 2008

Beiträge: 91

Mit GTK kenne ich mich nicht aus, aber das sollte hier ohne Belang sein.

Erstmal wird alles, was du innerhalb der Funktion anlegst, nur auf dem Stack angelegt. Dieser Bereich wird nach verlassen der Funktion freigegeben und der Bereich kann dann von anderen Funktionen benutzt werden. Für dich ist der Inhalt weg. Etwas anderes ist es natürlich, wenn du mit new zusätzlichen Speicher anforderst oder die Variable(n) statisch sind.

Dein Pointer auf Variable2 ist übrigens noch nicht initialisiert und enthält irgendein zufälliges Bitmuster. Wenn du direkt danach free() aufrufst, sollte es eigentlich krachen (außer da ist 0 drinn).

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Schmutzfink schrieb:

Mit GTK kenne ich mich nicht aus, aber das sollte hier ohne Belang sein.

Da hast du vollkommen recht, es handelt sich ja eigentlich um die Sprache C und die ist überall gleich.

Erstmal wird alles, was du innerhalb der Funktion anlegst, nur auf dem Stack angelegt. Dieser Bereich wird nach verlassen der Funktion freigegeben und der Bereich kann dann von anderen Funktionen benutzt werden. Für dich ist der Inhalt weg. Etwas anderes ist es natürlich, wenn du mit new zusätzlichen Speicher anforderst oder die Variable(n) statisch sind.

Besten Dank für Deine ausführliche Erklärung, die mir sehr viel hilft. 😀 Auch die Erklärung, wenn man Variablen statisch anlegt, das es dann etwas anders ist, hilft mir enorm Fehler zu vermeiden.

Dein Pointer auf Variable2 ist übrigens noch nicht initialisiert und enthält irgendein zufälliges Bitmuster. Wenn du direkt danach free() aufrufst, sollte es eigentlich krachen (außer da ist 0 drinn).

Naja, dieses sollte auch nur ein Beispiel sein, um zu zeigen, das man einen Pointer mit free bzw. g_free auch wieder freigeben kann.

Es mag vielleicht eine etwas grundlegende Frage von mir gewesen sein, wo ein Student am Anfang seines Studiums die Antwort erlernt, aber ich bin nun mal nur ein älterer Hobby-Programmierer und es ist nicht leicht, im Netz entsprechende Antworten auf solche ungewöhnlichen Fragen zu finden. Deshalb bin ich sehr froh und sehr dankbar das Du mir hierbei geholfen hast. Danke und Gruß Tom.

Neral

Anmeldungsdatum:
3. Oktober 2007

Beiträge: 230

tom111 schrieb:

Naja, dieses sollte auch nur ein Beispiel sein, um zu zeigen, das man einen Pointer mit free bzw. g_free auch wieder freigeben kann.

Wenn du das so formulierst, habe ich den Eindruck, dass du da noch ein erhebliches Verständnisproblem hast. Du musst unterscheiden zwischen dem Zeiger selbst und dem Speicher, auf den der Zeiger zeigt. Ein g_free(ptr) gibt nicht den Zeiger frei, sondern den Speicher, auf den der Zeiger zeigt.

solche ungewöhnlichen Fragen

Das sind keineswegs ungewöhnliche Fragen, und es gibt zum Thema Speicherverwaltung in C sehr viel Literatur. Vielleicht solltest du erstmal einen Schritt zurück gehen und Speicherverwaltung ohne Gtk lernen. Die Unterschiede zwischen Stack und Heap sowie storage duration sind in dem Zusammenhang wahrscheinlich interessant für dich.

Schmutzfink

Anmeldungsdatum:
29. Juni 2008

Beiträge: 91

Mit statischen Variablen sollte man in Programmen mit Threads genauso vorsichtig sein, wie mit globalen Variablen. Die können jederzeit verändert werden.

Naja, dieses sollte auch nur ein Beispiel sein, um zu zeigen, das man einen Pointer mit free bzw. g_free auch wieder freigeben kann.

Wenn man den Pointer nicht an den Aufrufer zurückgibt, sollte man das sogar tun. Ansonsten produziert man ein Speicherleck. Was man sich mit malloc() (oder new bei C++) holt, kommt vom Heap und muss auch explizit wieder freigegeben werden.

Es mag vielleicht eine etwas grundlegende Frage von mir gewesen sein, ...

Ich sage nur Sesamstrasse ...

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Neral schrieb:

Wenn du das so formulierst, habe ich den Eindruck, dass du da noch ein erhebliches Verständnisproblem hast.

Das hast du sehr gut erkannt. Denn ich habe niemals C so richtig gut gelernt. Es hatte ja auch bis vor ein paar Monaten nie einen Grund dafür gegeben. Aber jetzt wo ich nicht mehr drumherum komme, weil ich dringend ein ganz spezielles Programm benötige das es so nicht gibt, muss ich mich nun doch noch mehr in das Thema einarbeiten. Habe früher nur Mikrocontroller in Assembler programmiert und C lerne ich zur Zeit nach dem Verfahren, Versuchen und sehen was passiert... "Try and Error" oder wie man das so nennt. 😉 UND, ja, den größten Teil meines Programms habe ich nach diesem Verfahren schon erfolgreich zum laufen gebracht. Natürlich würde ein echter Profi wahrscheinlich die Hände über dem Kopf zusammenschlagen und in Tränen ausbrechen, wenn er den Programmcode sehen würde... Aber wenn sich das Programm ohne Fehlermeldung kompilieren lässt und auch das macht was es soll, keine System- Error- Meldung auftritt und auch nicht abstürzt, dann ist das für mich gut genug. 😇

Das sind keineswegs ungewöhnliche Fragen, und es gibt zum Thema Speicherverwaltung in C sehr viel Literatur. Vielleicht solltest du erstmal einen Schritt zurück gehen und Speicherverwaltung ohne Gtk lernen. Die Unterschiede zwischen Stack und Heap sowie storage duration sind in dem Zusammenhang wahrscheinlich interessant für dich.

Ich danke Dir für die weiteren sehr nützlichen Informationen, die mir auch erst einmal die Richtung beschreiben. Denn das Problem ist es ja immer erst einmal zu wissen, wonach man überhaupt im Netz suchen muss, um die richtigen Antworten zu finden. Deshalb auch nochmals besten Dank an alle Beteiligten für deren hilfreiche Unterstützung.

Schmutzfink schrieb:

Ich sage nur Sesamstrasse ...

😀 ja, ja 😀 die gute alte Sesamstraße... Auch wenn ich schon lange aus dem Alter heraus bin, aber den Text kennt man halt doch noch immer... 😎 ...der, die, das, wieso, weshalb, warum, wer nicht fragt.... usw. man kennt das ja. 😉 Danke für diese wirklich lustige Anregung.

Gruß Tom

Antworten |