[Development][Win32API]Windowsにおけるスタック変数(ローカル変数)とヒープ変数(グローバル変数)
教養としてのC言語:ITpro ニュース [okyuu.com]のエントリーでネタにした話の続き。
『by fujiyoshisyouta ( アクセス数:2571, 投稿数:226, マイクリップ数:74 ) |投稿時間:2008/10/06 10:11 』のコメントの検証用ソースコードを掲載してみたりします。
#include
#include
#include
#include
void *area1=NULL;
void Sub_Routine();
int _tmain(int argc, _TCHAR* argv[])
{
Sub_Routine();
printf("%s\0",area2); // Sub_Routine()関数内でmalloc()したメモリは有効のまま
// main()関数を終了するまで、malloc()した領域は有効のまま
return 0;
// 関数が終了すると、自動的にプロセスのヒープ領域が解放される
}
void Sub_Routine()
{
const char sample_string[]="Sample.\0";
void *area2=NULL; // 子関数内でメモリ確保予定のポインタ
area2=(void*)malloc(10); // 子関数内でメモリ確保を実行
// malloc()関数は、内部的にHeapAlloc()というWindowsのAPIを使用している。
// HeapAlloc()は、ヒープ領域にメモリを確保するので、明示的な解放
// (WindowsのAPI的にはHeapFree())するまでは使用可能である。
strncat_s((char*)area2,sizeof(area2),sample_string,strlen(sample_string));
area1=area2; // 子関数内で確保したメモリをグローバル領域に転記
printf("%s\0",area2);
// 関数Sub_Routine()を終了すると、ローカルな自動変数area2は
// 破棄される。
// しかし、area2はポインタ変数なので、そのポインタが指す実体
// はそのまま残る。(メモリリーク)
}- int _tmain(int argc, _TCHAR* argv[])
- void Sub_Routine()
このソース内には、関数が二つあって、前者がエントリポイント、後者はエントリポイントから呼び出されるサブルーチン。
theme : プログラミング
genre : コンピュータ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|





