C++ Chapter 14.6 : 예외 처리의 위험성과 단점

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 14. 예외처리 : 예외 처리의 위험성과 단점

1. 메모리 누수가 발생할 수 있다.

#include <iostream>
using namespace std;

int main()
{
	try
	{
		int * i = new int[1000000];  // 꽤 큰 메모리 할당

		throw "error";

		delete[] i;
	}
	catch (...)
	{
		cout << "Catch" << endl;
	}
	return 0;
}
  • 만약 위 코드에서 throw "error"가 발생한다면 아래의 delete이 실행 되지 못하고 바로 catch로 가기 때문에 delete이 되지 못한다.
    • 👉 메모리 누수 발생

cf. 스마트 포인터

  • #include <memory> 를 해야 한다.
  • unique_ptr 스마트 포인터를 사용하면 이같은 메모리 누수를 방지할 수 있다.
  • 해당 블록을 벗어나면 스마트 포인터가 알아서 동적 할당 받은 부분을 지워준다. → delete 이 필요가 없다.
#include <iostream>
#include <memory> ⭐⭐⭐
using namespace std;

int main()
{
	try
	{
		int * i = new int[1000000];
		unique_ptr<int> up_i(i); // ⭐스마트 포인터⭐

		throw "error";

		// delete[] i; 없어도 괜춚
	}
	catch (...)
	{
		cout << "Catch" << endl;
	}
	return 0;
}


2. 소멸자 안에선 예외를 던지면 안된다.

  • 소멸자는 해당 객체의 메모리를 날려버리는 순간 호출되는 것이기 때문에 정상적으로 예외를 던질 수 있는 상태로 보지 않는다
  • 따라서 소멸자 안에서 예외를 던지는 것은 위험하다.
  • 런타임 에러가 발생할 것
#include <iostream>
#include <memory>
using namespace std;

class A
{
public:
	~A()
	{
		throw "eroor";  //⭐⭐ 금기시 되는 일! 소멸자에선 예외를 던지면 안된다.
	}
};

int main()
{
	try
	{
		A a; // ⭐⭐
	}
	catch (...)
	{
		cout << "Catch" << endl;
	}
	return 0;
}


3. 루프 안에 try-catch 문을 넣는 것은 비추

  • try-catch 문 자체가 여러 스택을 왔다 갔다 하기도 하기 때문에 연산이 느리다.
  • 가장 많이 사용되는 루프(while, for) 안 에다가
    try-catch 를 넣으면 아주 느려질 수 있다.
  • 가급적 루프 바깥에서 쓰기.


4. 모든 오류를 예외처리로 잡으려고 하지 않기

  • 오류와 예외는 다르다.
  • 정상적으로 작동 해야하는 것은 성능을 위해 예측이 가능한 경우엔 if 문으로 걸러내는 것이 좋다.
    • ex) 사용자 입력 제대로 받기. 뭐 2글자 이상 못받으면 다시 받게 한다던지 등등
  • 분산처리, 네트워크 문제 이런건 예측할 수 없는 경우에 고장이 나기도 한다.
    • 논리적으로 예측이 어려운 경우엔 예외를 쓰는 것이 좋다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기