💻프로그래밍 내용 정리

    [C++ 7.4.3] weak_ptr

    [C++ 7.4.3] weak_ptr

    1. weak_ptr weak_ptr은 shared_ptr이 가리키는 리소스의 레퍼런스를 관리하는데 사용한다. weak_ptr은 리소스를 직접 소유하지 않기 때문에 shared_ptr이 해당 리소스를 해제하는 데 아무런 영향을 미치지 않는다. weak_ptr은 삭제될 때(예를 들어 스코프를 벗어날 때) 가리키던 리소스를 삭제하지 않고, shared_ptr이 그 리소스를 해제했는지 알아낼 수 있다. weak_ptr의 생성자는 shared_ptr이나 다른 weak_ptr을 인수로 받는다. weak_ptr에 저장된 포인터에 접근하려면 shared_ptr로 변환해야 한다. weak_ptr을 사용하는 예는 다음과 같다. #include using namespace std; class Simple { public:..

    [C++ 7.4.2] shared_ptr

    [C++ 7.4.2] shared_ptr

    1. shared_ptr shared_ptr의 사용법은 unique_ptr와 비슷하다. shared_ptr은 make_shared()로 생성한다. 이렇게 하는 것이 shared_ptr를 직접 생성하는 것보다 훨씬 효율적이다. 예를 들면 다음과 같다. auto mySimpleSmartPtr = make_shared(); C++17부터 shared_ptr도 unique_ptr와 마찬가지로 기존 C 스타일 동적 할당 배열에 대한 포인터를 지정할 수 있다. C++17 이전에는 이렇게 할 수 없었다. shared_ptr도 unique_ptr처럼 get()과 reset() 메서드를 제공한다. 다른 점은 reset()을 호출하면 레퍼런스 카운팅 메커니즘에 따라 마지막 shared_ptr가 제거되거나 리셋될 때 리소스..

    [C++ 7.4.1] unique_ptr

    1. unique_ptr 생성 방법 다음은 Simple 객체를 힙에 할당한 뒤 이를 해제하지 않아 메모리 누수가 현상이 발생하는 경우이다. void leaky() { Simple* mySimplePtr = new Simple(); mySimplePtr->go(); } 코드를 작성할 때 동적으로 할당한 메모리를 제대로 해제한다고 여기기 쉽다. 하지만 그렇지 않을 가능성이 훨씬 높다. 다음 함수를 보자. void couldBeLeaky() { Simple* mySimplePtr = new Simple(); mySimplePtr->go(); delete mySimplePtr; } 이 함수는 Simple 객체를 동적으로 할당해서 사용하고 나서 delete를 호출한다. 이렇게 해도 메모리 누수가 발생할 가능성은 ..

    [C++ 7.3.4] 객체 풀

    객체 풀 가비지 컬렉션은 뷔페식당에서 음식을 먹으면서 다 쓴 접시를 테이블 위에 두면 웨이터가 알아서 치워주는 것과 같다. 그런데 이보다 좀 더 효율적인것이 객체 풀이다. 객체 풀은 접시를 재사용하는 것에 비유할 수 있다. 사용할 접시 수를 미리 정해두고, 음식을 먹고 난 빈 접시에 다시 음식을 담아오는 것이다. 객체 풀은 타입이 같은 여러 개의 객체를 지속적으로 사용해야 하지만 매번 객체를 생성하면 오버헤드가 상당히 커지는 상황에 적용하기 좋다.

    [C++ 7.3.3] 가비지 컬렉션

    가비지 컬렉션 가비지 컬렉션을 제공하는 환경이라면 프로그래머가 객체에 할당된 메모리를 직접 해제할 일이 거의 없다. 더 이상 참조하지 않는 객체는 런타임 라이브러리에 의해 일정한 시점에 자동으로 해제되기 때문이다. C++은 자바나 C#과 달리 가비지 컬렉션이 기본으로 제공되지 않는다. 최신 버전의 C++은 스마트 포인터로 메모리를 관리할 수 있지만, 예전에는 new와 delete를 이용해 객체 수준에서 직접 메모리를 관리해야 했다. 가비지 컬렉션을 구현하는 기법 중에 표시 후 쓸기란 알고리즘이 있다. 가비지 컬렉터가 프로그램에 있는 모든 포인터를 주기적으로 검사한 뒤 여기서 참조하는 메모리를 계속 사용하고 있는지 여부를 표시한다. 한 주기가 끝날 시점에 아무런 표시가 되지 않은 메모리는 더 이상 사용하지..

    [C++ 7.3.2] 커스텀 메모리 관리

    커스텀 메모리 관리 C++에서 기본으로 제공하는 메모리 할당 기능만으로도 대부분의 일을 처리할 수 있다. new와 delete의 내부 처리과정을 보면 메모리를 적절한 크기로 잘라서 전달하고, 현재 메모리에서 사용할 수 있는 공간을 관리하고, 다 쓴 메모리를 해제하는데 필요한 모든 작업을 수행한다. 리소스가 부족하거나 메모리 관리와 같은 작업을 할 때는 메모리를 직접 다뤄야 할 수도 있다. 핵심은 클래스에 큰 덩어리의 메모리를 할당해놓고 필요할 때마다 잘라 쓰는 것이다. 이렇게 직접 관리하면 오버헤드를 좀 더 줄일 수 있다. 오버헤드란 new로 메모리를 할당하면 현재 프로그램에서 얼마나 할당했는지 기록하는 데 필요한 공간을 말한다. 이렇게 기록해둬야 delete를 호출할 때 딱 필요한 만큼 해제할 수 있다..