[C++] 유니크 포인터

닿메_dahme
|2024. 12. 31. 21:13

2024년 12월 31일 화요일(2024년의 마지막 날...)

아닛 벌써 한 것도 없는데 2025년이라니..?

이번 년도는 퇴사도 하고.. 백수 생활도 하고.. 여러 경험을 해봤다..

하지만 아직 실력은 늘지 않은 것 같다고!!

언어는 다 거기서 거기라고 생각했지만 막상 C++ 기초부터 깊게 제대로 공부하니까 미치겠다고!!!!!

 

오늘의 나

 

어찌되었든 오늘은 C++에서 가장 중요하고! 가장 많이 쓰이고! 그냥 숨쉬듯이 써야하는!

제일 중요한 포인터를 공부해봤다. (사실 숨쉬듯이 써먹어야한다는 조언을 듣고.. 얘부터 확실하게 이해해야 다음 챕터 공부를 수월하게 진행할 수 있을 것 같아서 오늘도 약간 진도가 밀렸다..ㅎ)

그럼 바로 포인터를 알아보자!

 

포인터

사용하는 이유 : 메모리에 직접적으로 관리

int a = 10;
int* ptr_a = &a;

cout << a << endl;
cout << &a << endl;
cout << ptr_a << endl;
cout << *ptr_a << endl;

// output
// 10
// a가 저장되어있는 메모리 주소값
// a가 저장되어있는 메모리 주소값
// 10
  • 참조(&-앤퍼센트) : 변수의 메모리 주소 가져옴
    • &a → a의 주소
  • 역참조(*) : 포인터가 가리키는 주소에 저장된 값을 가져옴
    • *a → a의 값

 

Dangling Pointer

  • 이미 해지된 메모리를 참고하고 있는 포인터

 

Unique Pointer

  • 레퍼런스 카운터가 최대 1개인 스마트 포인터
  • 소유권을 넘겨주는 것은 가능하지만, 동시에 2개 이상 소유 못함
  • 복사 또는 대입이 안됨(이렇게 하면 컴파일 에러 발생)
// unique pointer 생성할 때
#include <memory>  // unique_ptr 사용

unique_ptr<int> ptr1 = make_unique<int>(10);

unique_ptr과 make_unique는 서로 짝

// 컴파일 에러 발생하는 상황
#include <memory>  // unique_ptr 사용

unique_ptr<int> ptr1 = make_unique<int>(10);
unique_ptr<int> ptr2 = ptr1;  // 여기서 이미 ptr이 메모리 참조값을 가지고 있음(최대 1개 만족)
// 가능한 상황
#include <memory>  // unique_ptr 사용
using
unique_ptr<int> ptr1 = make_unique<int>(10);
unique_ptr<int> ptr2 = move(ptr1);  // ptr의 소유권을 ptr2로 이동

// ptr은 이제 비어있게됨
if (!ptr1)
	cout << "ptr1은 비어있음" << endl;

 

 

포인터도 원시 포인터가 있고 스마트 포인터가 있었다..

뭔가 알듯말듯 이해한 것 같은데 막상 문제 풀면 틀리고..

머리로 이해하고 손으로 먼저 확실하게 이해한 다음에 코드로 만져봐야겠다.