소멸자로부터 예외가 터져 나가는 경우를 C++ 언어에서 막는 것은 아니지만, 실제 상황을 들춰보면 확실히 우리가 막을 수밖에 없는 것 같습니다. 예를 들어 보죠. class Widget{ public: ~ Widget(){ } //이 함수로부터 예외가 발생합니다. }; void doSometing() { std::vector v; ... }// v는 여기서 자동으로 소멸됩니다. 다음과 같은 상황에서 백터 v가 10개라고 가정하였을 때, 함수가 끝나고 소멸하게 되는데 이때 첫 번째 객체에서 소멸자가에서 오류가 발생한 이후, 또 다시 두 번째 객체에서 소멸자에서 오류가 발생하게 되면, 두개의 예외가 동시에 만들어진 상태입니다. 그렇게 되면 프로그램이 터지던지 정의되지 않은 행동을 보일텐데 이때는 정의되지 않..
Class를 생성할 때, 컴파일러는 기본적으로 생성자, 소멸자, 복사 생성자, 복사 대입 생성자를 자동으로 생성하게 된다. class Empty(){ public: Empty(){ } ~Empty() { } Empty(const Empty& rhs) { } Empty& operator=(const Empty& rhs) { } } Empty e1;// 기본 Empty e2(e1);// 복사 e2 = e1;// 복사 대입 이렇게 자동으로 생성되는 코드는 예상치 못한 오류를 일으킬 수 있습니다. 예를 들어 가상 소멸자가 생성되어야 하는데 비가상 소멸자가 생성된다던가, 몰래 만들어진 복사 생성자로 인해 객체가 예상치 못한 작동을 할 수도 있죠. 고로 이러한 함수들은 막거나, 직접 생성하여야 합니다. 이 내용은 ..
Effective C++을 읽는 도중에, 이 내용은 꼭 필요한거 같아서 이렇게 기록합니다. 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가? 더보기 설계에 따라서 클래스 생성자 및 소멸자의 설계가 바뀌게 됩니다. 뿐만 아니라 메모리 할당 함수(operator new, new[], delete, delete[])를 직접 작성할 경ㅇ에는 이들 함수의 설계에도 영향을 미칩니다. 객체 초기화는 객체 대입과 어떻게 달려져야 하는가? 더보기 초기화와 대입을 다르게 두는 것이 중요한데, 각각에 해당하는 함수 호출이 다르기 때문입니다. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가? 더보기 어떤 타입에 대해 '값에 의한 전달'을 구현하는 것은 복사 생성자이기 때문에, ..
현재 프로그램을 짜거나 할 때 const를 자주 사용하지 않았었는데, 이 주제에서 const를 상당히 중요하게 보는 것을 보고 깨우쳤습니다. 상당히 중요해 보이더라구요. 특히 컴파일 할 때 에러를 잡아줄 수 있는 부분의 메리트가 상당히 커 보였습니다. 다음은 const가 붙는 위치에 따른 변수의 변화입니다. char test1[] = "Hello"; char test2[] = "World"; char *p = greeting; const char *p = greeting // 비상수 포인터 // 상수 데이터 [0] = test2[0]; //error p = test2; //complete char * const p = greeting // 상수 포인터 // 비상수 데이터 p[0] = test2[0]; /..