○メモリの解放

ヒープ領域に作成された変数(newにより作成された変数)は手動(delete)で開放する必要があります
開放しないとメモリリークを引き起こします。

test*a=new test();
delete a;	//開放

test*b=new test[100];
delete [] b;	//配列の開放

■自動変数(newしていない)のためメモリリークしない例
{}を抜けた時点でオブジェクトがなくなります。

#include <stdio.h>

class test{
public :
	int i;
};

int main(){
	while(1){
		test a();
		test b[10];
	}
	return 0;
}

■newによりメモリリークを起こす例
testクラスをnewすることによってメモリが確保されていきます

#include <stdio.h>

class test{
public :
	int i;
};

int main(){
	test*a;
	while(1){
		a=new test();
	}
	return 0;
}

■上の修正版
newされたtestクラスをdeleteにて開放しています

#include <stdio.h>

class test{
public :
	int i;
};

int main(){
	test*a;
	while(1){
		a=new test();
		delete a;
	}
	return 0;
}

■newによりメモリリークを起こす例
testクラス配列をnewすることによってメモリが確保されていきます

#include <stdio.h>

class test{
public :
	int i;
};

int main(){
	test*a;
	while(1){
		a=new test[10];
	}
	return 0;
}

■上の修正版
newされたtestクラス配列をdelete [] にて開放しています

#include <stdio.h>

class test{
public :
	int i;
};

int main(){
	test*a;
	while(1){
		a=new test[10];
		delete [] a;
	}
	return 0;
}

■newによりメモリリークを起こす例
char配列をnewすることによってメモリが確保されていきます

#include <stdio.h>

int main(){
	while(1){
		char*a;
		a=new char[10];
	}
	return 0;
}

■上の修正版
newされたchar配列をdelete [] にて開放しています

#include <stdio.h>

int main(){
	while(1){
		char*a;
		a=new char[10];
		delete [] a;
	}
	return 0;
}



▲トップページ > Windows と C++