GameChoi
Choi Programming
GameChoi
전체 방문자
오늘
어제
  • 분류 전체보기 (468)
    • C++ Algorithm & Study (184)
      • C++ & Algorithm Strategies (45)
      • Game Math & DirectX 11 (72)
      • Server + UE5 (29)
      • Lyra Clone Coding (37)
    • Create Game (284)
      • [Window API] Game Client & .. (55)
      • [DirectX] DirectX 2D & 3D (155)
      • [UE5] BLUEPRINT & C++ (74)
    • odds and ends (0)
      • English (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • server
  • UE5
  • RPG Game
  • Player State
  • Algorithm Strategies
  • Game Server
  • c++
  • client
  • job queue
  • Destination Move Packet
  • Network Worker
  • Direct11
  • Player Move Packet
  • Direct3D
  • session
  • Game Room
  • core
  • protobuf
  • Other Character
  • GAME Client

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GameChoi

Choi Programming

[C++] 14 - 기초 문법 공부 일지(Smart Pointer)
C++ Algorithm & Study/C++ & Algorithm Strategies

[C++] 14 - 기초 문법 공부 일지(Smart Pointer)

2022. 12. 11. 23:52

1. Smart Pointer (c++ 11)

 - new 및 delete를 사용하여 동적으로 할당받은 메모리는 반드시 해제

 - 메모리 누수 → 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다.

 - 포인터처럼 동작하는 클래스 템플릿

   - 사용이 끝난 메모리를 자동 해제

 - Smart Pointer 사용시 소멸자는 객체의 사용이 끝나면 자동 호출

   - 직접 헤체하지 않아도 자동으로 해제

class Knight
{
public:
	Knight(int hp, int maxHp) : hp(hp), maxHp(maxHp) {}

public:
	int hp;
	int maxHp;
};

class SmartPtr
{
public:
	SmartPtr(Knight* k) : kptr(k) {}
	~SmartPtr() { delete kptr; cout << "delete" << endl; }

public:
	Knight* kptr = nullptr;
};

int main()
{
	SmartPtr p = new Knight(100, 100);
    // 종료 시 자동 삭제
}

2. 스마트 포인터의 종류

 - Shared Pointer

   - 하나의 특정 객체를 참조하는 스마트 포인터의 개수를 참조하는 스마트 포인터

     - 참조하고 있는 스마트 포인터의 개수 → reference count

       - 해당 메모리를 참조하는 포인터가 몇개인지 나타내는 값

       - 스마트 포인터가 추가함에따라 1씩 증가 및 사용하지 않으면 1 씩 감소

       - 스마트 포인터가 참조하는 포인터가 0이 됨에 따라 자동으로 메모리 해체

   -  Make Shared

     - 전달받은 인수를 사용하여 지정된 객체를 생성

     - 생성된 객체를 참조하는 shared_ptr을 반환 → 예외발생에 대해 안전하게 생성

 - 자신이 참조하고 있는 객체의 수명에 직접적으로 관여

 - 객체 하나가 소멸되더라도, 동일한 메모리 주소를 참조하는 다른 객체가 있으면 참조하고 있는 객체는 소멸X

class Knight
{
public:
	Knight(int id) : id(id), k(nullptr) {}
	~Knight() {}
	
public:
	int id = 0;
	shared_ptr<Knight> k = nullptr;
};

int main()
{
	shared_ptr<Knight> k1 = make_shared<Knight>(1);
	shared_ptr<Knight> k2 = make_shared<Knight>(2);
	// use_count -> reference count (객체가 현재 가리키고 있는 객체를 참조 중인 소유자의 수를 반환)
	cout << k1.use_count() << endl; // 1
	cout << k2.use_count() << endl; // 1

	k2->k = k1;
	cout << k1.use_count() << endl; // 2
	cout << k2.use_count() << endl; // 1
}

 

- Weak Pointer

   - shared pointer의 객체만 참조, shared_ptr의 reference count를 올리지 않음

   - weak pointer이 shared pointer을 참조할 때 shared pointer의 weak reference count 증가, reference count X

   - 서로가 서로를 가리키는 shared_ptr → reference count가 0이 될 수가 없음

       - 메모리가 해제되지 않는 순환 참조 발생 → weak_ptr 사용(순환 참조를 제거)

class Knight
{
public:
	Knight(int id) : id(id), k(nullptr) {}
	~Knight() {}
	
public:
	int id = 0;
	shared_ptr<Knight> k = nullptr;
};

int main()
{
	shared_ptr<Knight> k1 = make_shared<Knight>(1);
	shared_ptr<Knight> k2 = make_shared<Knight>(2);
	cout << k1.use_count() << endl; // k1 - 1
	cout << k2.use_count() << endl; // k1 - 1
	weak_ptr<Knight> wp1 = k1; // k1 -> weak 1, strong 1
	{
		weak_ptr<Knight> wp2 = k1; // k2 -> weak 2, strong 1
	} // k2 -> weak 1, strong 1 - weak 소멸
	cout << k1.use_count() << endl; // 1
	cout << k2.use_count() << endl; // 1
}

strong / weak

 

- Unique Pointer

   - 하나의 스마트 포인터만이 객체를 가리킴

   - 다른 스마트 포인터를 사용시 move()함수를 사용하여 가리키는 객체를 변경

class Knight
{
public:
	Knight(int id) : id(id), k(nullptr) {}
	~Knight() {}
	
public:
	int id = 0;
	
	shared_ptr<Knight> k = nullptr;
};

int main()
{
	unique_ptr<Knight> k1 (new Knight(1));
	unique_ptr<Knight> k2 = std::move(k1);
}

error

'C++ Algorithm & Study > C++ & Algorithm Strategies' 카테고리의 다른 글

[Programmers] 올바른 괄호  (0) 2022.12.15
[Programmers] 디펜스 게임  (0) 2022.12.15
[C++] 13 - 기초 문법 공부 일지(Sort)  (1) 2022.12.08
[C++] 12 - 기초 문법 공부 일지(STL)  (0) 2022.12.06
[C++] 11 - 기초 문법 공부 일지(MAP)  (0) 2022.12.06
    'C++ Algorithm & Study/C++ & Algorithm Strategies' 카테고리의 다른 글
    • [Programmers] 올바른 괄호
    • [Programmers] 디펜스 게임
    • [C++] 13 - 기초 문법 공부 일지(Sort)
    • [C++] 12 - 기초 문법 공부 일지(STL)
    GameChoi
    GameChoi

    티스토리툴바