C++ 포인터, 스마트 포인터

장재근·2025년 6월 4일

개인 공부용

목록 보기
22/31

포인터

Pointer - 메모리 값에 대한 주소 값을 저장하는 변수
type* ptr = &x; // 포인터 생성, 동적 메모리 할당에 유용
변수 x와 변수 x의 포인터 ptr

x = x의 값 = *ptr
&x = x의 주소 값 = ptr
ptr = 포인터가 가르키는 주소 값 = &x
*ptr = 주소에 일력된 값, 역참조 = x


클래스 포인터

class variable; // 클래스 변수 선언
class* ptr;	// 클래스 포인터 변수 선언

variable.func(); // <code>.</code> 접근 연산자를 사용하여 멤버 접근
ptr->func(); // <code>-></code> 접근 연산자를 사용하여 멤버 접근

동적 메모리 할당, 해제

할당 new , 해제(소멸) delete

type* ptr = new type(value); // 동적 메모리 할당
delete ptr; // 메모리 할당 해제

주의할 점

  • 해제를 안할 시 메모리 누수 (memory leak)
  • 해제 후 사용 시 문제 발생 (dangling pointer)

이를 방지하기 위해 스마트 포인터를 사용합니다.


스마트 포인터

Smart Pointer
#include <memory>
C++의 특별한 타입으로, 포인터이지만 스스로 메모리를 관리합니다. 메모리 관리의 복잡성을 줄이고, 메모리 누수를 방지합니다. 더 이상 필요하지 않을 때 자동으로 메모리 할당을 해제합니다.


auto_ptr

  • 현재 unique_ptr로 대체됨, 사장됨
  • 자동포인터
  • 스코프가 끝날 때 자동으로 메모리 해제
  • 복사 연산 허용
    ↳ 동일한 메모리를 관리하는 포인터를 동시 사용 시 문제 발생
    ↳ unique_ptr로 대체된 이유
auto_ptr<int> ptr1(new int); // 포인터 선언
*ptr1 = 5; // 역참조를 통해 값 입력
auto_ptr<int> ptr2 = ptr1; // 복사
cout << *ptr2 << *ptr1; // undefined behavior

unique_ptr

  • 유일 포인터
  • 스코프가 끝날 때 자동으로 메모리 해제
  • 주소 값에 대해 단일 소유권을 지님
  • move()함수를 통한 소유권 이전
  • 원시 포인터와 할당되는 메모리 크기가 같음
    ↳ 성능 저하 X, 안정성, 신뢰도↑
unique_ptr<int> ptr1(new int(5)); // 선언 및 초기화
unique_ptr<int> ptr2(new int); // 선언
ptr2 = move(ptr1); // 소유권 이전 *ptr2 = 5;
// ptr1은 nullptr

shared_ptr


weak_ptr

profile
계속 화이팅입니다~

0개의 댓글