프로그래밍/Effective C++(35)
-
new로 생성한 객체를 스마트포인터에 저장하는 코드는 별도의 한 문장(effective c++ 17)
정리new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들자. 이것이 안 되어 있으면, 예외가 발생될 때 디버깅 하기 힘든 자원 누출이 초래될 수 있다. 예제해당 코드의 경우 컴파일이 된다. 문제점함수의 매개변수로 넘겨지는 인자를 평가(evalutate): priority() 호출 ->“new Widget” 표현식 실행 -> shared_ptr 생성자 호출 연산이 호출되는 순서는 컴파일러 제작사마다 다르다.※ 자바 및 C#은 매개변수의 평가 순서가 특정하게 고정되어있다. priority()가 두 번째로 호출 되고 예외가 발생했다면???new Widget은 누수!!! 해결따로!
2015.08.20 -
new/delete 형태 맞추기(effective c++ 16)
정리- new 표현식에 []를 썻으면, 대응되는 delete 표현식에도 []를 써야한다.- new 표현식에 []를 안 썼다면, 대응되는 delete 표현식에도 []를 쓰지말아야 한다.
2015.08.20 -
자원관리 클래스의 자원은 접근 가능하게(effective c++ 15)
형변환을 통한 외부 접근타입 불일치- 실수 없이 자원을 관리하기 위해서는 스마트 포인터를 활용하는 방법이 소개되었다.- 그러나 API 함수를 비롯한 표준 함수들은 원시 포인터(native pointer)를 원한다. 원시 포인터, 스마트 포인터- 원시 포인터int* pa;- 스마트 포인터std::tr1::shared_ptr ps; 형변환 필요성- 스마트 포인터는 해당 타입을 감싸고 있는 하나의 객체로 원시 포인터와는 엄연히 다른 타입이다.- 원시 포인터를 필요로 하는 함수가 있을 경우 이를 형변환해주어야 컴파일 에러를 피할 수 있다. 스마트 포인터get 함수- 해당 타입의 원시 포인터 사본을 반환하는 멤버 함수이다.- auto_ptr과 shared_ptr 모두 사용 가능하다.- 반환값 : 해당 타입의 원시..
2015.08.20 -
자원관리 클래스의 복사 동작에 대해(effective c++ 14)
상황RAII(Resource Acquisition is Initialization), 자원의 획득으로 초기화된 자원 관리 클래스의 객체가 복사 생성자를 통해 복사되는 상황. 문제자원 관리 클래스 객체는 생성 시에 자원을 획득하고, 소멸 시에 해당 자원을 해제하는 용도로 쓰인다. 그러나, 해당 객체가 두 개 이상 존재하게 되면 자원을 두 번 이상 해제하는 중복 해제 문제가 생기게 된다.또한, 두 스레드가 동시에 소유할 수 없는 동기화 객체인 뮤텍스(Mutex, Mutual Exclusion)와 같은 경우에도 자원 관리 객체가 두 개 이상 존재할 이유는 없다. 해결1. 복사 자체를 금하기상황RAII 객체가 복사되도록 놔두는 것 자체가 말이 안 되는 경우.예를 들어, 스레드 동기화 객체의 경우 사본은 의미가 ..
2015.08.12 -
템플릿으로 만들어진 기본 클래스 접근하기(effective c++ 43)
템플릿 기본 클래스 호출 시 문제점템플릿 기본 클래스의 함수를 호출하는데 템플릿 매개변수의 인스턴스가 무엇이 생성되는지 알 수 없기 때문에 해당 함수를 찾지 못하는 문제점이 있다. 해결방안기본 클래스 함수에 대한 호출문 앞에 this 키워드를 사용해 준다. using 선언을 통해 기본 클래스의 이름을 파생 클래스의 유효범위로 끌어온다. 호출할 함수가 기본 클래스의 함수라는 점을 명시적으로 지정한다. (Base::)- 이 방법은 추천하진 않는다.(명시적 한정으로 가상 함수일 경우 바인딩이 무시된다) 정리파생 클래스 템플릿에서 기본 클래스 템플릿의 이름을 참조할 때는, this 접두사 붙이자. 또는 기본 클래스 한정문을 명시적으로 써 주자. 예시 1234567891011121314151617181920212..
2015.08.07 -
자원 관리는 객체가 그만(effective c++ 13)
결론자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII 객체를 사용하자. 일반적으로 널리 쓰이는 RAII 클래스는 tr1::shared_ptr 그리고 auto_ptr이지만 tr1::shared_ptr이 복사 시의 동작이 직관적이기 때문에 더 좋다. 객체 사용특징자원을 획득한 후에 자원 관리 객체에 넘긴다.- 자원 획득 및 초기화( Resource Acquisition Is Initialization: RAII )자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 한다.- 소멸자는 어떤 객체가 소멸될 때 자동적으로 호출되기 때문에, 자원 해제가 제대로 이루어진다. 목적자원 해제를 일일이 하다 보면 실수할 가능성이 있다.delete 문을 건너 뛰게 되면..
2015.08.07