본문 바로가기
프로그래밍/MFC (C++)

MFC ] new 로 동적할당 한 건 창이 닫히기 전에 OnDestroy() 에서 delete로 해제하기

by eteo 2022. 7. 6.

 

생성자에서 동적할당한건 소멸자에서 해제하면 될텐데 생성자가 아닌 곳에서 동적할당 한 것인데 할당해제할 시기가 마땅치 않은 경우 창이 닫히기 전에 해제하면 다음과 같이 해제하면 메모리 누수를 막을 수 있다.

 

프로젝트 - 클래스 마법사

 

 

 

 

 

해당되는 다이얼로그에서 메시지, WM_DESTORY 를 추가한다.

 

 

 

 

 

아래와 같이 OnDestory() 함수 안에 new 로 동적할당 한 것을 모두 delete 하는 코드를 추가한다.

큰 의미는 없지만 delete 후에 .clear() 까지 해줬다.

 

void CCarAccidentListDlg::OnDestroy()
{
	if (DC.getList().size() != 0)
	{
		for (int i = 0; i < DC.getList().size(); i++)
		{
			delete DC.getList().at(i);
		}
		DC.getList().clear();
	}
	CDialogEx::OnDestroy();

}

 

 

 

 

 

버튼을 눌렀을 때 동적할당하도록 이벤트 처리기를 구성했다면 두 번 동적할당 하지 않도록 방지하는 코드도 넣는다.

 

void DataController::loadListFromFile()
{
	ifstream data("ANSIData.csv");
	
	string line;
		
	if(list.size()!=0)
	{
		return;
	}

	while (getline(data, line))
	{
		stringstream linestream(line);
		string cell[COLUMN_NUMBER];
		for (int j = 0; j < COLUMN_NUMBER; j++)
		{
			getline(linestream, cell[j], ',');
		}
		list.push_back(new Data(cell[0], cell[1], &cell[2]));
	}
}

 

나는 벡터의 사이즈가 0이 아닐 땐 바로 리턴하도록 했다.