Chapter 3

언어/C++

[Effective C++] new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자

항목 17 : new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 처리 우선순위를 알려 주는 함수가 하나 있고, 동적으로 할당한 Widget 객체에 대해 어떤 우선순위에 따라 처리를 적용하는 함수가 하나 있다고 가정합시다. 1 2 int prioirty(); void processWidget(std::tr1::shared_ptr pw, int prioirty); 자원 관리에는 객체를 사용하는 것이 좋기 때문에 processWidget 함수는 동적 할당된 Widget 객체에 대해 스마트 포인터를 사용하도록 만들어졌습니다. 이렇게 만들어진 processWidget 함수를 이제 호출합니다. 1 processWidget(new Widget, prioirty()); 이렇게 호출을 하..

언어/C++

[Effective C++] new 및 delete를 사용할 때는 형태를 반드시 맞추자

항목 16 : new 및 delete를 사용할 때는 형태를 반드시 맞추자 아래에 적어 놓은 것에서 뭔가 잘못된 점이 보이나요? 1 2 3 std::string *stringArray = new std::string[100]; ... delete stringArray; 아무런 문제가 없어 보이지만, 100개의 string 객체 가운데 99개는 정상적인 소멸과정을 거치지 못할 가능성이 큽니다. 여러분이 new 연산자를 사용해서 표현식을 꾸미게 되면, 이로 인해 두 가지의 내부 동작이 진행됩니다. 일단 메모리가 할당됩니다. 그 다음, 할당된 메모리에 대해 한 개 이상의 생성자가 호출됩니다. delete 표현식을 쓸 경우에는 또 다른 두 가지의 내부 동작이 진행되는데, 우선 기존에 할당된 메모리에 대해 한 개 ..

언어/C++

[Effective C++] 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자

항목 15 : 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자 자원 관리 클래스는 재치 만발의 듬직한 클래스입니다. 실수로 터질 수 있는 자원 누출을 튼튼히 막아 주는 보호벽 역할을 해 주니까요. 1 std::tr1::shared_ptr pInv(createInvestment()); 이때 어떤 Investment 객체를 사용하는 함수로서 여러분이 사용하려고 하는 것이 다음과 같다고 가정해 봅시다. 1 int daysHeld(const Investment *pi); // 투자금이 유입된 이후로 경과한 날수 그리고 이렇게 호출하고 싶을 텐데요. 1 int days = daysHeld(pInv); // 에러 애석하게도 이 코드는 컴파일이 안 됩니다. daysHeld 함수는 Investme..

언어/C++

[Effective C++] 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자

항목 14 : 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 자원 관리 클래스를 스스로 만들어야 할 필요를 느끼는 경우가 있습니다. 예를 하나 들어 보죠, Mutex 타입의 뮤텍스 객체를 조작하는 C API를 사용하는 중이라고 가정합시다. 이 C API에서 제공하는 함수 중엔 lock 및 unlock이 있고요. 1 2 3 void lock(Mutex *pm); // pm이 가리키는 뮤텍스에 잠금을 겁니다. void unlock(Mutex *pm) // pm이 가리키는 해당 뮤텍스의 잠금을 풉니다. 그런데 뮤텍스 잠금을 관리하는 클래스를 하나 만들고 싶습니다. 이전에 걸어 놓은 뮤텍스 잠금을 잊지 않고 풀어 줄 목적인 거죠. 이런 용도의 클래스는 기본적으로 RAII 법칙을 따라 구성합니다. 즉, ..

언어/C++

[Effective C++] 자원 관리에는 객체가 그만!

항목 13 : 자원 관리에는 객체가 그만! 투자를 모델링해 주는 클래스 라이브러리를 가지고 어떤 작업을 한다고 가정합시다. 이 라이브러리는 Investment라는 최상위 클래스가 있고, 이것을 기본으로 하여 구체적인 형태의 투자 클래스가 파생되어 있습니다. 1 class Investment { ... }; // 여러 형태의 투자를 모델링한 클래스 계통의 최상위 클래스 가정을 하나 더 하겠습니다. 이 라이브러리는 Investment에서 파생된 클래스의 객체를 사용자가 얻어내는 용도로 팩토리 함수만을 쓰도록 만들어져 있다고요. 1 2 Investment* createInvestment(); // Investment 클래스 계통에 속한 클래스의 객체를 동적 할당하고 그 포인터를 반환합니다. // 이 객체의 해..

지나가던 개발자
'Chapter 3' 태그의 글 목록