본문 바로가기
언어 공부/C++

클래스와 예외 처리2

by 세희홍 2022. 7. 8.

생성자 내부의 예외 처리

1. 스택에 객체를 생성한 경우

- 생성자 내부에서 예외 발생

생성자 내부에서 예외가 발생한다면 프로그램이 중단되며 또한 스택에 할당된 모든 메모리가 해제된다. (생성자가 중단되며 소멸자는 실행되지 않는다)

 

2. 힙에 객체를 생성하는 경우

- 정상 작동

1. 생성자 호출 -> 객체 생성, 스택에 삽입

2. 생성자 실행 -> 힙 메모리 할당, 값 저장

3. main으로 리턴, obj 변수에 객체 할당

4. 소멸자 호출 -> 힙에 할당된 메모리 해제

5. 스택에서 객체 삭제

 

- 생성자 내부에서 예외 발생

1. 생성자 호출 -> 객체 생성, 스택에 삽입

2. 힙에 메모리 영역 할당, 변수 저장할 때 예외 발생

3. 생성자 중단 -> 스택 해제로 객체 삭제. But, 소명자 호출X-힙 영역 해제X

 

* 메모리 누수 발생

-> function-try 블록 or 스마트 포인터 사용하기

 


1. function-try 블록

DynamicArray::DynamicArray(int arraySize) : size(arraySize) {
	try {
		arr = new int[arraySize]; // 동적 메모리 할당
		if (arr == NULL)
			throw MemoryException(this, 200, 1000);
	}
	catch (...) {
		cout << "생성자 안쪽 예외처리\n";
		delete[] arr;
		arr = nullptr;
		throw; //호출했던 메인함수로 돌아가기 위해
	}
}

DynamicArray da1(10); 에서 객체를 생성할 때 에러가 발생하는 것이기 때문에 try문 안에 넣어준다. 

int main() {
	try {
		DynamicArray da1(10);
		UseArray(da1);
	}
	catch (const MemoryException& err) {
		cout << "에러코드 : " << err.errorCode << "\n";
		cout << "예외객체 번지 주소 : " << err.sender << "\n";
		cout << "예외종류 : " << err.description << "\n";
		cout << "에러정보 : " << err.info << "\n";
	}
	catch (...) {
		cout << "예외발생 : 프로그램을 종료합니다\n";
	}
}

2. 스마트 포인터

// 생성자
Integer::Integer(int v)
try: sp(new int)  
{
  *sp = v;
}
catch(...)
{
  throw;
}
// 소멸자 
Integer::~Integer()
{
}
// 접근자 함수
int Integer::getValue()
{
  return *sp;
}

try 구문 안에서 new로 객체를 생성하고 sp의 포인터가 그 주소를 받는다. 힙에 v를 저장.

 


 

소멸자에서는 예외가 발생하지 않는다. 예외처리를 하지 않음.

'언어 공부 > C++' 카테고리의 다른 글

템플릿_스택 구현  (0) 2022.07.09
템플릿  (0) 2022.07.09
클래스와 예외 처리  (0) 2022.07.07
예외 처리2  (0) 2022.07.06
예외 처리  (0) 2022.07.06

댓글