C++ Exception

Tags:

리누스는 C++를 싫어해…

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++에 예외처리에 대해 잘 다루고 있지만, 번역서를 샀는데 번역이 개판이라 망연자실중.