자원 관리하기

김여울·2025년 6월 5일
0

내일배움캠프

목록 보기
16/114

OOP 과제하면서 혼자 공부하느라 어려웠던 내용이 2주차 강의에 있었다...
앞으로는 강의를 다 보고 나서 과제를 시작해야겠다.

자원 관리하기

📎 강의 자료 + 필기

스택 메모리 vs 힙 메모리

구분정적 메모리 (스택 등)동적 메모리 (힙)
언제 결정?컴파일할 때 이미 크기가 정해져 있음런타임(실행 중)→ 상황에 따라 실행 중에 필요한 만큼 사용
어디에 저장?스택 영역힙 영역
어떻게 선언?일반 변수new, malloc
무슨 변수로 받나?일반 변수 (int, float 등)포인터 변수 (int*, UObject* 등)
생성 예시int a = 5;int* a = new int(5);
삭제 방법자동 삭제 (함수가 종료되면)수동 삭제 (delete a;)
위험 요소거의 없음메모리 누수 위험 있음

메모리 전체 크기 = 힙 > 스택
큰 배열을 선언할 때 힙만 가능할 수 있음
캐릭터 같은 건 힙 메모리에 생성한다

힙 메모리 동적할당

  • 동적 할당
    : new 키워드를 사용
    → 내가 요청한 공간만큼 메모리를 동적으로 할당
    → 주소를 반환함
    → 주소는 ptr로 받음
    : delete를 사용해 수동으로 해제

    • 단일 변수 = new type, delete
    • 배열 = new type[], delete[]
// 단일 변수 
int* p = new int; // int 변수 하나 동적 할당
delete p; // 메모리 해제


// 배열
int* arr = new int[10]; // 10개의 int 배열 동적 할당
delete[] arr; // 배열 메모리 해제

Dangling Pointer

이미 없어진 메모리를 가리키고 있는 포인터
얕은 복사 시, Dangling Pointer 위험 있음

int* ptr = new int(10); // 힙 메모리에 정수 10을 만들고 그 주소를 ptr이 가짐
delete ptr;             // ptr이 가리키는 메모리를 삭제함
*ptr = 20;              // 이미 없어진 메모리를 접근하고 있음

ptr = nullptr;  // 없어진 주소는 지우고 널 포인터로 만들어둠

➡ 귀찮으니까 자동으로 관리해주는 스마트 포인터 사용하면 된다

스마트 포인터

#include <memory> // 헤더 파일 추가

✅ unique_ptr

: 관찰/소유 (포인터 하나)
가장 가볍고 빠름. 소유권이 하나여야 할 때 적합

✅ shared_ptr

: 관찰/소유 (포인터 여러 개)
여러 객체가 공유해야 할 때 적합하지만 비용(성능)이 더 듬

여러 포인터가 하나의 메모리를 공유/소유함
→ 레퍼런스 카운트 이용해서 몇 개의 포인터가 같은 객체를 공유하고 있는지 자동으로 관리
use_count() 현재 객체를 참조하는 포인터의 수 확인
reset() 소유 중인 객체를 해제하거나 다른 객체로 변경

포인터 a, 포인터 b가 한 공간을 소유함 → Reference Count : 2
포인터 a 소멸 → Reference Count : 1
포인터 b 소멸 → Reference Count : 0 → 메모리 자동 해제

순환 참조

만약 shared_ptr 두 개가 서로를 가리키면 둘 다 소멸하지 못하는 문제 발생
→ Reference Count : 0 ❌ → 메모리 자동 해제 ❌

✅ weak_ptr

: 관찰 (포인터 여러 개)
약한 참조 → Reference Count 증가시키지 않음
shared_ptr의 순환참조를 막기 위해 사용
lock() shared_ptr이 유효한지 확인하고 사용해야 함
→ 순환 참조 문제 발생하면 순환 고리 중 하나를 weak으로 변경하면 됨

종류소유권참조 가능 개수레퍼런스 카운트메모리 해제 시점순환참조 문제용도/특징
unique_ptrO (단일 소유)1개만 가능없음소유자가 scope 벗어나면 자동 해제없음소유권 이전 가능 (std::move 필요)
shared_ptrO (공유 소유)여러 개 가능있음참조 카운트가 0이 되는 순간 자동 해제있음레퍼런스 카운트 기반 자동 관리
weak_ptrX (소유권 없음)shared_ptr의 객체만 관찰없음관련 shared_ptr들이 모두 사라졌을 때 해제없음순환참조 해결용. 관찰만 가능

📎[C/C++ 강좌] 96강. 스마트 포인터
강의가 어려워서 유튜브를 찾아봤다. 그치만 문제가 있는데.. 앞에 내용을 모르는게 많아서 30%만 이해도 아닌 단어가 익숙한 정도... 3일 동안 캠프 없으니까 유튜브 강의는 쉴 때 누워서 봐야겠다.

0개의 댓글