the whole C++ exception handling thing is fundamentally broken. It’s _especially_ broken for kernels.
아마도 다음과 같은 이유때문에 예외처리의 문제점을 지적한듯: EXCEPTION HANDLING: A FALSE SENSE OF SECURITY. 최근에 Scott Myers가 진행하는 C++에 대한 이야기들에 소개되서 읽어본 문서입니다.
template
void Stack::push(T element)
{
top++;
if( top == nelems-1 ){
T* new_buffer = new T[nelems+=10];
if( new_buffer == 0 )
throw “out of memory”; // (1)
for(int i = 0; i < top; i++)
new_buffer[i] = v[i];
delete [] v;
v = new_buffer;
}
v[top] = element;
}
[/code]
와 같은 stack 의 push가 있다고 할때 (1)에서 예외가 발생한다면, top++이 이미 수행되었으므로 문제.
[code lang="cpp"]
template
void Stack::push(T element)
{
top++;
if( top == nelems-1 ){
T* new_buffer = new T[nelems+=10];
if( new_buffer == 0 )
throw "out of memory"; // (1)
for(int i = 0; i < top; i++)
new_buffer[i] = v[i]; // (2)
delete [] v;
v = new_buffer;
}
v[top] = element;
}
[/code]
이렇게 해결한다면 보시다시피 (1)의 시점에서 throw되면 T* new_buffer에 new한 내용은 leak. 여기가 잘되었다고 하더라도, (2)에서 만약 T의 operator= 가 throw하게된다면 역시나 T* new_buffer에 할당한 내용은 leak.
결국 C++의 예외처리가 어렵다..라는 것은 이를 의미하는 것일 듯 합니다. Exceptional C++에 예외처리에 대해 잘 다루고 있지만, 번역서를 샀는데 번역이 개판이라 망연자실중.