unique_ptr이란?
C++ 표준 라이브러리 <memory> 헤더에 정의된 스마트 포인터로, 동적 메모리를 안전하고 효율적으로 관리하는데 사용
unique_ptr은 소유권이 하남나 존재하는 스마트 포인터로, 복사할 수 없지만, 소유권을 이동할 수 있다.
주요 특징
1. 단일 소유권
- unique_ptr은 한 번에 하나의 포인터만 메모리 리소스를 소유할 수 있다.
- 복사 생성자와 복사 대입 연산자가 삭제 되어 있어 복사가 불가능하다.
- 소유권을 이동하려면 std::move를 사용하면 된다.
2. 자동 해제
- unique_ptr이 범위를 벗어나면 소유하고 있는 메모리를 자동으로 해제한다.(delete 호출)
3. 가벼움
- unique_ptr은 추가적인 참조 카운터를 사용하지 않으므로 shared_ptr보다 가볍다.
#include <iostream>
#include <memory>
using namespace std;
class MyClass
{
public:
MyClass()
{
cout << "MyClass 생성" << endl;
}
~MyClass()
{
cout << "MyClass 소멸" << endl;
}
void display()
{
cout << "Hello, unique_ptr" << endl;
}
};
int main()
{
unique_ptr<MyClass> myPtr = make_unique<MyClass>(); // unique_ptr 생성
myPtr->display(); // 멤버 함수 호출
return 0; // unique_ptr은 자동으로 소멸자를 호출하여 메모리를 해제
}
소유권 이동
unique_ptr은 복사가 불가능하지만, std::move를 사용해 소유권을 이동할 수 있다.
unique_ptr<MyClass> ptr1 = make_unique<MyClass>();
unique_ptr<MyClass> ptr2 = std::move(ptr1);
if(!ptr1)
{
cout << "ptr1은 이제 비어있음" << endl;
}
해제
소유하고 있는 객체를 명시적으로 해제하려면 reset을 사용한다.
ptr.reset();
shared_ptr이란?
C++ 표준 라이브러리 <memory> 헤더에 정의된 스마트 포인터 중 하나로, 참조 카운팅(reference counting)을 통해 동적 메모리의 공유 소유권을 관리한다.
주요 특징
1. 공유 소유권
- shared_ptr을 여러 객체가 동시에 소율할 수 있다.
- 소유권을 공유하는 모든 shared_ptr이 삭제될 때 리소스가 해제된다.
2. 참조 카운터
- shared_ptr은 내부적으로 참조 카운터를 유지한다.
- 새로운 shared_ptr이 소멸하거나 reset 되면 참조 카운터가 감소한다.
- 참조 카운터가 0이 되면 리소스를 해제한다.
3. 자동 메모리 관리
- shared_ptr은 동적 메모리를 안전하게 관리하며, 사용자가 수동으로 delete를 호출할 필요가 없다.
#include <iostream>
#include <memory>
using namespace std;
int main()
{
shared_ptr<int> ptr1 = make_shared<int>(10); // 정수 10을 관리하는 shared_ptr 생성
cout << "값 : " << *ptr1 << endl;
return 0;
}
use_count()
현재 리소스를 공유하고 있는 shared_ptr의 개수를 반환한다.
cout << ptr.use_count() << endl;
#include <iostream>
#include <memory>
using namespace std;
class MyClass
{
public:
MyClass(){
cout << "MyClass 생성" << endl;
}
~MyClass(){
cout << "MyClass 소멸" << endl;
}
};
int main(){
shared_ptr<MyClass> ptr1 = make_shared<MyClass>(); // 객체 생성
shared_ptr<MyClass> ptr2 = ptr1; // 소유권 공유
cout << "참조 카운트 : " << ptr1.use_count() << endl; // 참조 카운트 출력 2
ptr1.reset(); // ptr1 소유권 해제
cout << "참조 카운트: " << ptr2.use_count() << endl; // 남은 참조 카운트 출력 1
return 0;'C++' 카테고리의 다른 글
| 전략 패턴을 이용한 정렬 알고리즘 (0) | 2025.01.20 |
|---|---|
| string을 매개변수로 받을 때 &를 사용하는 이유 (0) | 2025.01.07 |
| C++ 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) (0) | 2025.01.07 |
| C++ STL vector (0) | 2024.12.24 |
| C++ rand() 사용해서 난수 만들기 (0) | 2024.12.23 |