15

参照として返され、別の関数に直接ポインターとして渡されると、静的変数はどうなりますか?明らかに、変数は関数が戻った後も存続しますが、この概念全体についての何かが私を悩ませています。データのメモリはどの時点で解放されますか?静的変数によって占有されていますか?ある種のガベージコレクションのように、ランタイムは不要になったときに魔法のように気づきますか?

例を挙げると:

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);
    }
}

rectSDL_BlitSurface()が戻った後はどうなりますか?いつ解放されるかわかりません。それでは、これはある種のメモリリークではないでしょうか。

4

3 に答える 3

13

データのメモリはどの時点で解放されますか?静的変数によって占有されていますか?ある種のガベージコレクションのように、ランタイムは不要になったときに魔法のように気づきますか?

プログラムの終了時に解放されますが、すぐには解放されません。また、デストラクタが呼び出されることが保証されています。

于 2012-11-16T21:22:26.190 に答える
6

メモリリークはありませんが、それは本当に、本当に悪い考えです。このようなコードを書いたとしましょう

SDL_someFunction(
    XSDL_RectConstr(0, 0, 100, 100), 
    XSDL_RectConstr(20, 20, 30, 30)
);

静的な長方形が1つしかないためSDL_someFunction、取得しようとしているように見えるさまざまな長方形を取得することはありません。代わりに、同じ長方形を2回取得します。

于 2012-11-16T21:27:05.233 に答える
5

rectから戻ったときに解放されSDL_BlitSurfaceませんが、メモリリークも発生しません。静的ストレージにあるため、「リーク」するものはありません。プログラムが実行されている限り、オブジェクトはメモリに残ります。

これの最大の欠点は、マルチスレッドを開始するときに発生します。静的変数は、複数のスレッドから同時に変更されるリスクがあります。これは、避けたいことです。

静的ストレージ期間(ブロックスコープまたは名前空間スコープで宣言された)の初期化されたオブジェクトのデストラクタは、mainからの戻りの結果として、およびexitの呼び出しの結果として呼び出されます。

于 2012-11-16T21:23:05.160 に答える