C++ (6) 썸네일형 리스트형 항목 17: new 로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 자원 누출 가능성 스마트 포인터 생성 코드 처리 우선순위를 알려주는 함수와 동적으로 할당한 Widget 객체에 대해 우선순위에 따라 처리를 적용하는 함수가 있다고 하자 int priority(); void processWidget(std::shard_ptr pw, int priority); //shared_ptr 을 통해 자원관리호출시 아래와 같이 쓰면 컴파일 에러가 난다! processWidget(new Widget, priority());shared_ptr 의 생성자는 explicit 로 선언되어 있기 때문에, new Widget 에 의해 만들어진 포인터가 shared_ptr 타입의 객체로 바뀌는 암시적 변환은 일어나지 않는다. 그래서 아래와 같이 써줘야 한다. processWidget(shared_.. 항목 15: 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자 자원 관리 클래스의 자원 접근 자원에 접근하려 하는 예 아래 createInvestment 로 자원을 만든 후, pInv 에 넘겨주는 경우를 생각해보자 (항목 13 예제) shared_ptr pInv(createInvestment());그리고 Investment 객체를 사용하는 함수가 다음과 같이 정의 되어있다고 하자 int daysHeld(const Investment *p); //그러면 이렇게 호출하고 싶겠죠 int days = daysHeld(pInv); 그러나 위와 같이 할 경우 컴파일이 되지 않는다. daysHeld 는 Investment * 타입의 포인터를 원하는데 , shared_ptr 타입을 넘기고 있으니 안되는 것! RAII 클래스 객체의 자원 변환 위 문제를 해결하기 위해서는 결국 RA.. 항목 13: 자원 관리에는 객체가 그만! 참고 : 책에서는 auto_ptr 을 예로 들어서 계속 설명하지만, auto_ptr 은 사용권장 되고 있지 않기 때문에 관련한 부분은 여기에 적지 않았다. 스마트 포인터 동적 할당한 객체의 문제 아래와 같이 동적할당한 객체를 얻어내고, 해당 객체를 사용한 뒤에 delete 해주는 함수가 있다하자. void f() { Investment *pInv = createInvestment(); ... delete pInv; }이 경우 해당 객체를 삭제 하지 못하는 경우가 발생할 수 있다. 1) delete 이전에 함수가 리턴되는 상황 2) 도중에 예외가 던져져서 delete를 하지 못하는 상황 createInvestment 로 얻어낸 자원이 항상 해제되도록 하는 방법은, 자원을 객체에 넣고 그 자원을 소멸자가 맡.. 항목 31 : 파일사이의 컴파일 의존성을 줄이자 인터페이스와 구현의 분리 c++ 의 class definiton 는 클래스 인터페이스 + 구현 세부사항까지 지정 할 수 있어서 c++ 은 인터페이스와 구현을 깔끔하게 분리하기 힘들다. 예를 들어 아래 코드처럼 Person 구현의 세부사항에 속하는 Date, Address 정의된 정보를 가져오기 위해 "date.h", "address.h" 들을 물어와야 한다. #include #include "date.h" #include "address.h" class Person { public: Person(const Date& birthday, const Address& addr); private : std::string name; Date theBirthDate; //구현 세부사항 Address theAddres.. Move Semantic Move Semantics (이동 문법) 이동 생성자와 이동 할당 연산자를 구현한 클래스를 move semantic 을 갖고 있다고 한다. 변수(이름으로 참조 할 수 있는 데이터)는 깊은 복사를 하고, 임시값(이름으로 참조 할 수 없는 데이터)이 데이터를 전송한다는 컨셉 객체에 대한 메모리 소유권을 이동시키면서 댕글링 포인터, 메모리 릭을 방지 ( (해제된 메모리를 가리키고 있는 것을 댕글링 포인터라고 한다.) 불필요한 복사를 줄일 수 있다. 벡터 같은 컨테이너에 원소 복사시 유용하게 쓰인다. 객체를 컨테이너에 가져 올 때, 객체 복제가 아닌 이동시킬 수 있다. 임시 객체를 리턴할 때도, 일반 복제 대입 연산 대신에 이동 연산을 이용한다.. lvalue , rvalue lvalue : 주소값을 취할 수 .. vector [c++14 STL 철저입문] 참고 vector 컨테이너 순차열 컨테이너. 길이가 가변적임 순차열의 끝에서만 원소를 추가하거나 삭제 할 수 있음 vector 에 할당된 용량(capcaity) 를 초과하는 즉시 더 많은 원소를 저장할 수 있는 추가공간이 자동 할당됨 -> 크기가 커질때 발생하는 오버헤드나 중간에 원소를 삽입 or 삭제하는 오버헤드를 잘 알고 사용한다면 눈에 띄게 느려지는 일은 없음 capacity : 메모리를 추가 할당하지 않아도 저장할 수 있는 원소들의 개수. 실제 원소의 개수를 말하는게 아님 vector values{1,12,3,5}; values.reserve(7); //용량을 7로 늘린다. vector 함수 멤버 reserve() vector 가 수용할 수 있는 메모리를 할당 res.. 이전 1 다음