생성자 내부의 예외 처리
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를 저장.
소멸자에서는 예외가 발생하지 않는다. 예외처리를 하지 않음.
댓글