Was passiert mit einer statischen Variablen, wenn sie als Referenz zurückgegeben und als Zeiger direkt an eine andere Funktion übergeben wird? Offensichtlich bleibt die Variable nach der Rückkehr der Funktion bestehen, aber etwas an diesem ganzen Konzept stört mich. An welchem Punkt wird der Speicher auf der Datensequenz, belegt durch die statische Variable, freigegeben? Spürt die Laufzeit auf magische Weise, wenn ich sie nicht mehr brauche, wie eine Art Müllsammlung?Statische lokale Variablen als Referenzen zurückgeben
ein Beispiel geben:
SDL_Rect* XSDL_RectConstr(int x, int y, int w, int h)
{
static SDL_Rect rect;
rect.x = x;
rect.y = y;
rect.w = w;
rect.h = h;
return ▭
}
void mainLoop()
{
while(isRunning)
{
pollEvents();
SDL_BlitSurface(someSurface, XSDL_RectConstr(0, 0, 100, 100), screen, NULL);
SDL_Flip(screen);
}
}
Was nach SDL_BlitSurface() kehrt zu rect
passiert? Ich kann nicht sehen, wann es befreit werden würde. Wäre das nicht eine Art Speicherleck?
Also wird es immer noch riesige Mengen an Speicher verschwenden, da es in einer Endlosschleife läuft, oder? Oder überschreibt es sich jedes Mal, wenn XSDL_RectConstr() aufgerufen wird? Außerdem ist SDL_rect eine Struktur, keine Klasse und hat daher keinen Destruktor, aber ich denke, das ist irrelevant. – CaffeineAddict
Es überschreibt sich selbst, das ist das Problem. Jede Struktur (und jede Klasse) hat einen Destruktor, wenn Sie keinen schreiben, wird ein Standard-Destruktor generiert. – john
Es "überschreibt" nichts. Es ist das gleiche Objekt. Die einzige Magie hier ist, dass es nicht konstruiert wird, bis Sie diese Funktion das erste Mal betreten; Abgesehen von den üblichen Scoping-Regeln gibt es an dieser Stelle nichts anderes als ein im Namespace-Bereich definiertes statisches Attribut. Es ist wie ein statisches "Mitglied" der Funktion. –