1 ) 메모리가 충분하지 않을 경우 표준 형태의 new들이 오류를 보고하는 두 가지 주된 방식들을 설명하라.

표준형태 하나는 std::bad_alloc 예외를 던지는 방법과, 예외를 던지지 않고, NULL을 리턴하는 방법, 이렇게 두가지가 있다.


2 ) 예외를 던지지 않는 nothrow 형태의 new가 좀더 예외에 안전한 코드를 작성하는 데 도움이 될까? 근거와 함께 답하라.

나는 도움이 된다고 생각한다. 왜냐하면, NULL 을 반환하게 되었을 때, 처리하지 않고, 지나가면 되기 때문이다. 하지만 이 근거를 곰곰히 생각해 보면, 필요한 메모리를 잡는게 오류가 났는데, 어떻게 정상적으로 프로그램이 구동 될 수 있겠냐는 오류를 범한 것이다.

이 NULL 이 반환하게 되었을 때, 곰곰히 생각해 보면, 나는 할 수 있는 일이 없다. 물론 미리 메모리를 잡아 두었던 상태라면, 그 메모리를 사용 하게 짤 수도 있겠지만, 이건 .. 특수환 경우이고, 메모리를 동적으로 생성하는데 문제가 생겼을 때는 대부분 할 수 있는 일이 없다고 본다.

결국, 프로그램을 종료시키는게 더 좋은 방법으로 생각 되고, 프로그램 종료시 하나라도 더 리소스를 반환하는게 더 좋다는게 된다. 그렇다면 예외를 던지게 함으로써, 스택 풀림이 일어나면서, 소멸자를 호출하고, 리소르를 반환하게 하면 될 것이다.

이것은 예외를 던지지 않은 형태보다, 예외를 던지는 형태가 일반적인 경우 더 좋다는 것을 뜻 한다.


3 ) 표준 C++ 하에서 또는 표준 C++를 완전히 벗어난 상황에서, 메모리 고갈을 정검하는게 실질적으로 불가능하거나 무의미한 상황을 서술하라.

1. 메모리가 쓰이기 전까지 메모리를 잡지 않는 시스템에서는 new 실패의 정검은 무용지물이다.

왜냐하면, 이런 시스템에선 new가 항상 성공하기 때문이다. 여기서 성공은 메모리를 잡는게 아니다. 실제로 메모리를 사용 할 때 잡는 것이다. 이런 시스템의 배경은 최적화 때문이다. 이렇게 성공적으로 new가 리턴되었을 때, 실제 메모리에 접근 하려고 할 때, 에러를 발생 시킬 수 있게 된다. 접근 할 때 에러가 발생되는데 .. 무슨 손 쓸 방법이 있겠는가?

2. 실제 상황에서 new 실패는 매우 드물며, 일단 일어났다면 상당히 심각한 상황인 것이다.

몇일 전에 형준이가 ASE 로더를 만드는 중에, new 할당 실패가 발생되어, 예외를 던지는 것을 보았다. 메모리를 충분히 있는 상태였음에도 메모리를 잡지 못하는 것을 참 이상하게 생각했다. 갖은 노력 끝에, 버그는 "스택 꼬임"때문에 생긴 오류인 것으로 확인 되었다. 요소 10개를 갖는 배열에 엑세스 할 때, 30번째에 엑세스 해서, 작업을 했는데, 이때는 아무 오류가 없다가, 메모리 할당할려는 순서가 되면, 메모리를 잡을 수 없다고 나오는 것이였다.

정말 상당히 심각한 상황이였고, 할 수 있는 일이라곤, "왜 메모리 할당이 실패 하는가?" 를 찾는 것 밖에 없었다.

3. new 실패를 잡았다고 해도 할 수 있는 일은 별로 많지 않은 경우가 있다.

.. 메모리 할당이 실패했는데, 더 이상 프로그램을 운용해 봐야 무엇을 하겠는가? .. 흔한 STL 컨테이너들 도 못쓰고, string 도 못쓰고, .... 할 수 있는 일이라곤, "도대체 왜 할당이 실패하는거야!" 를 알아 내는 것 밖에 없다.


총평

nothrow new가 보통 new 보다 더 이로운 것은 없다. 또한 new 실패를 잡는다 해도, 할 만한 일은 없다.(특수하게 미리 메모리를 할당해 두어서, 메모리 할당 실패하면, 이것으로 사용 하게 하겠다도 있지만, 이런 특수적인 것은 제외 하자.)

그러고 보면 예외 발생이 그렇게까지 유용하지 않다고 생각 된다. 예외를 잡는다 해도, 할 만한 일은 없기 때문이다. 차라리 예외를 발생시키지 않도록 안전하게 작성하게 더 좋다고 생각 된다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요