1

これは、lazyfooのSDLチュートリアルのコード例です。

SDL_Surface *load_image( std::string filename ) { 

//Temporary storage for the image that's loaded 
SDL_Surface* loadedImage = NULL; 
//The optimized image that will be used 
SDL_Surface* optimizedImage = NULL; 

//Load the image 
loadedImage = SDL_LoadBMP( filename.c_str() ); 


//If nothing went wrong in loading the image 
if( loadedImage != NULL ) { 
    //Create an optimized image 
    optimizedImage = SDL_DisplayFormat( loadedImage ); 
    //Free the old image 
    SDL_FreeSurface( loadedImage ); 
} 

//Return the optimized image 
return optimizedImage; 
} 

ここで、optimizedImageが戻ったときにスコープから外れるべきではありませんか?それはローカルであるように見てください。

4

2 に答える 2

2

それは行いますが、それが指す割り当てられたメモリではありません。これは単なる4バイトのポインタ変数であり、必要なのはその値を保持することだけです。

値はアドレスです。アドレスは手動で制御された方法で割り当てられたものであり、アドレスの割り当てを解除するには、コンパイラが認識していない関数を呼び出す必要があります。

于 2010-06-21T07:25:50.393 に答える
0

OptimizedImageは関数のスタックにあるため、関数が戻った後にスコープ外になります。それが指すオブジェクトはヒープ内にあるため、他のポインターがそれを参照しなくなるまでそこに残ります。

于 2010-06-21T07:30:56.723 に答える