-
[C++] 스마트 포인터프로그래밍/C & C++ 2024. 7. 1. 12:05728x90반응형
스마트 포인터(smart pointer)는 C++에서 메모리 관리를 자동화하고 메모리 누수를 방지하기 위해 사용되는 객체입니다. 스마트 포인터는 표준 라이브러리에서 제공되며, 일반 포인터와 달리 소멸 시 자동으로 메모리를 해제하는 기능을 제공합니다. 스마트 포인터는 RAII(Resource Acquisition Is Initialization) 원칙을 따르며, 다음과 같은 주요 스마트 포인터 유형이 있습니다:
std::unique_ptrstd::shared_ptrstd::weak_ptr
1.
std::unique_ptrstd::unique_ptr는 소유권이 단 하나의 포인터에만 귀속되도록 보장하는 스마트 포인터입니다. 다른 포인터로 복사될 수 없으며, 유일하게 소유권을 가집니다.사용 예시:
#include <iostream> #include <memory> class Resource { public: Resource() { std::cout << "Resource acquired\n"; } ~Resource() { std::cout << "Resource released\n"; } void sayHello() const { std::cout << "Hello, World!\n"; } }; int main() { { std::unique_ptr<Resource> res = std::make_unique<Resource>(); res->sayHello(); } // res가 scope를 벗어나면서 소멸자가 호출되어 메모리가 해제됩니다. return 0; }2.
std::shared_ptrstd::shared_ptr는 여러 포인터가 동일한 자원을 공유할 수 있도록 하는 스마트 포인터입니다. 참조 카운트를 유지하며, 마지막std::shared_ptr가 소멸될 때 자원을 해제합니다.사용 예시:
#include <iostream> #include <memory> class Resource { public: Resource() { std::cout << "Resource acquired\n"; } ~Resource() { std::cout << "Resource released\n"; } void sayHello() const { std::cout << "Hello, World!\n"; } }; int main() { std::shared_ptr<Resource> res1; { std::shared_ptr<Resource> res2 = std::make_shared<Resource>(); res1 = res2; // res1과 res2가 동일한 자원을 공유 res2->sayHello(); } // res2가 scope를 벗어나지만 res1이 여전히 자원을 가리킴 res1->sayHello(); // res1이 scope를 벗어날 때 자원이 해제됩니다. return 0; }3.
std::weak_ptrstd::weak_ptr는std::shared_ptr가 관리하는 자원에 대한 비소유 참조를 제공합니다.std::weak_ptr는 참조 카운트를 증가시키지 않으며, 순환 참조 문제를 해결하는 데 사용됩니다.사용 예시:
#include <iostream> #include <memory> class Resource { public: Resource() { std::cout << "Resource acquired\n"; } ~Resource() { std::cout << "Resource released\n"; } void sayHello() const { std::cout << "Hello, World!\n"; } }; int main() { std::shared_ptr<Resource> res1 = std::make_shared<Resource>(); std::weak_ptr<Resource> weakRes = res1; { std::shared_ptr<Resource> res2 = weakRes.lock(); // weak_ptr을 shared_ptr로 승격 if (res2) { res2->sayHello(); } } // res2가 scope를 벗어남 res1->sayHello(); // res1이 scope를 벗어날 때 자원이 해제됩니다. return 0; }스마트 포인터의 장점
- 자동 메모리 관리: 스마트 포인터는 소멸 시 자동으로 메모리를 해제하므로, 메모리 누수를 방지할 수 있습니다.
- 안전성: 일반 포인터와 달리 스마트 포인터는 복사 및 이동 시 소유권을 명확하게 관리하므로, 더 안전한 코드 작성이 가능합니다.
- 편의성: 스마트 포인터는 표준 라이브러리의 일부로, 다양한 편의 기능을 제공합니다.
스마트 포인터는 C++에서 안전하고 효율적인 메모리 관리를 위해 필수적으로 사용되는 도구입니다. 특정 상황에 맞는 스마트 포인터를 적절히 선택하여 사용하면, 메모리 관리가 훨씬 쉬워집니다.
728x90반응형'프로그래밍 > C & C++' 카테고리의 다른 글
[C++] 깊은 복사와 얕은 복사 (0) 2024.07.05 [C++] 참조자를 통해 객체의 멤버에 접근 (0) 2024.07.02 [C++] 포인터를 통해 객체의 멤버에 접근 (0) 2024.07.01 [C++] std 뜻 (0) 2024.06.30 [C++] 포인터와 참조자 (0) 2024.06.30