250x250
반응형
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

재 현

스마트 포인터(smart pointer) 본문

C++

스마트 포인터(smart pointer)

본명은이점례 2023. 7. 31. 18:53
728x90

이번 글에서는 C++의 스마트 포인터(Smart Pointer)에 대해 자세히 알아보겠습니다. 스마트 포인터는 C++11부터 표준 라이브러리에 추가된 기능으로, 메모리 관리를 자동화하고 메모리 누수를 방지하는데 도움이 됩니다. C++ 개발에서 스마트 포인터를 적절히 활용하면 프로그램의 안전성과 효율성을 향상시킬 수 있습니다.

스마트 포인터란?

스마트 포인터는 C++에서 자동 메모리 관리를 지원하기 위한 클래스로, RAII(Resource Acquisition Is Initialization) 디자인 패턴을 활용하여 자원을 자동으로 해제합니다. 스마트 포인터는 일반 포인터와 유사하게 동작하지만, 메모리를 자동으로 해제하므로 메모리 누수를 방지하고 예기치 않은 동작을 방지할 수 있습니다. 즉 메모리를 자동으로 관리해준다,라고 생각하면 됩니다. 하지만 미연의 사고를 방지하기 위해 null check는 필수입니다.

스마트 포인터 종류

C++ 표준 라이브러리에서는 다음과 같은 세 가지 스마트 포인터를 제공합니다.

1. `std::unique_ptr`

- `std::unique_ptr`은 오직 하나의 스마트 포인터만이 특정 자원을 소유합니다.
- 소유권을 이동시키는 성격을 갖기 때문에 다른 `unique_ptr`에 자원을 이동시킬 수 있습니다.
- 스마트 포인터가 소멸되면 자동으로 해당 자원을 해제합니다.

std::unique_ptr<int> ptr = std::make_unique<int>(42);



2. `std::shared_ptr`

- `std::shared_ptr`은 여러 개의 스마트 포인터가 하나의 자원을 공유할 수 있도록 합니다.
- 참조 카운팅(reference counting)을 이용하여 자원의 참조 횟수를 관리합니다.
- 마지막 참조자가 사라지면 자동으로 자원을 해제합니다.

std::shared_ptr<int> ptr1 = std::make_shared<int>(42);
std::shared_ptr<int> ptr2 = ptr1; // ptr1과 ptr2가 같은 자원을 공유



3. `std::weak_ptr`

- `std::weak_ptr`은 `shared_ptr`과 함께 사용하여 순환 참조(circular references)를 해결합니다.
- `weak_ptr`은 자원의 소유권을 갖지 않으며, 자원에 접근할 때 `lock()` 함수를 사용하여 `shared_ptr`로 변환해야 합니다.
- `shared_ptr`이 자원을 해제하면 `weak_ptr`은 자동으로 무효화됩니다.

std::shared_ptr<int> sharedPtr = std::make_shared<int>(100);
std::weak_ptr<int> weakPtr = sharedPtr;



스마트 포인터 사용 시 주의사항

순환 참조를 주의해야 합니다. `shared_ptr`로 서로를 참조하는 경우, 자원이 해제되지 않을 수 있습니다.
- 스마트 포인터를 사용하는 경우 기존의 일반 포인터와 함께 사용하면 안됩니다. 하나의 자원에 두 가지 방식으로 할당과 해제를 시도할 수 있어서 예기치 않은 동작을 초래할 수 있습니다.
- `shared_ptr` 대신 `unique_ptr`를 사용하여 가능한 경우 소유권 전달을 선호하는 것이 좋습니다.

 

 

결론

스마트 포인터는 C++에서 메모리 관리를 간편하게 처리하는 강력한 기능입니다. RAII 패턴과 함께 사용하여 자동 메모리 관리와 예외 처리를 간편하게 처리할 수 있습니다. 스마트 포인터를 적절히 활용하면 메모리 누수와 관련된 버그를 예방하고, 안전하고 효율적인 C++ 코드를 작성할 수 있습니다. 기존의 일반 포인터 사용을 최대한 피하고, `unique_ptr`과 `shared_ptr`을 적절하게 활용하여 C++ 개발의 생산성과 안정성을 향상하는 걸 추천합니다.

 


이상으로 C++ 스마트 포인터에 대한 간략한 소개였습니다. 좀 더 깊이 있는 학습을 통해 C++ 스마트 포인터의 강력함을 더욱 체감하시길 바랍니다. 감사합니다.

728x90

'C++' 카테고리의 다른 글

C++ 가상 함수 (Virtual Functions) 이해하기  (0) 2023.10.06
C++의 메모리  (0) 2023.07.31