OOP 과제하면서 혼자 공부하느라 어려웠던 내용이 2주차 강의에 있었다...
앞으로는 강의를 다 보고 나서 과제를 시작해야겠다.
| 구분 | 정적 메모리 (스택 등) | 동적 메모리 (힙) |
|---|---|---|
| 언제 결정? | 컴파일할 때 이미 크기가 정해져 있음 | 런타임(실행 중)→ 상황에 따라 실행 중에 필요한 만큼 사용 |
| 어디에 저장? | 스택 영역 | 힙 영역 |
| 어떻게 선언? | 일반 변수 | new, malloc 등 |
| 무슨 변수로 받나? | 일반 변수 (int, float 등) | 포인터 변수 (int*, UObject* 등) |
| 생성 예시 | int a = 5; | int* a = new int(5); |
| 삭제 방법 | 자동 삭제 (함수가 종료되면) | 수동 삭제 (delete a;) |
| 위험 요소 | 거의 없음 | 메모리 누수 위험 있음 |
메모리 전체 크기 = 힙 > 스택
큰 배열을 선언할 때 힙만 가능할 수 있음
캐릭터 같은 건 힙 메모리에 생성한다
동적 할당
: new 키워드를 사용
→ 내가 요청한 공간만큼 메모리를 동적으로 할당
→ 주소를 반환함
→ 주소는 ptr로 받음
: delete를 사용해 수동으로 해제
new type, deletenew type[], delete[] // 단일 변수
int* p = new int; // int 변수 하나 동적 할당
delete p; // 메모리 해제
// 배열
int* arr = new int[10]; // 10개의 int 배열 동적 할당
delete[] arr; // 배열 메모리 해제
이미 없어진 메모리를 가리키고 있는 포인터
얕은 복사 시, Dangling Pointer 위험 있음
int* ptr = new int(10); // 힙 메모리에 정수 10을 만들고 그 주소를 ptr이 가짐
delete ptr; // ptr이 가리키는 메모리를 삭제함
*ptr = 20; // 이미 없어진 메모리를 접근하고 있음
ptr = nullptr; // 없어진 주소는 지우고 널 포인터로 만들어둠
➡ 귀찮으니까 자동으로 관리해주는 스마트 포인터 사용하면 된다
#include <memory> // 헤더 파일 추가
: 관찰/소유 (포인터 하나)
가장 가볍고 빠름. 소유권이 하나여야 할 때 적합
: 관찰/소유 (포인터 여러 개)
여러 객체가 공유해야 할 때 적합하지만 비용(성능)이 더 듬
여러 포인터가 하나의 메모리를 공유/소유함
→ 레퍼런스 카운트 이용해서 몇 개의 포인터가 같은 객체를 공유하고 있는지 자동으로 관리
→ use_count() 현재 객체를 참조하는 포인터의 수 확인
→ reset() 소유 중인 객체를 해제하거나 다른 객체로 변경
포인터 a, 포인터 b가 한 공간을 소유함 → Reference Count : 2
포인터 a 소멸 → Reference Count : 1
포인터 b 소멸 → Reference Count : 0 → 메모리 자동 해제
만약 shared_ptr 두 개가 서로를 가리키면 둘 다 소멸하지 못하는 문제 발생
→ Reference Count : 0 ❌ → 메모리 자동 해제 ❌
: 관찰 (포인터 여러 개)
약한 참조 → Reference Count 증가시키지 않음
shared_ptr의 순환참조를 막기 위해 사용
→lock() shared_ptr이 유효한지 확인하고 사용해야 함
→ 순환 참조 문제 발생하면 순환 고리 중 하나를 weak으로 변경하면 됨
| 종류 | 소유권 | 참조 가능 개수 | 레퍼런스 카운트 | 메모리 해제 시점 | 순환참조 문제 | 용도/특징 |
|---|---|---|---|---|---|---|
unique_ptr | O (단일 소유) | 1개만 가능 | 없음 | 소유자가 scope 벗어나면 자동 해제 | 없음 | 소유권 이전 가능 (std::move 필요) |
shared_ptr | O (공유 소유) | 여러 개 가능 | 있음 | 참조 카운트가 0이 되는 순간 자동 해제 | 있음 | 레퍼런스 카운트 기반 자동 관리 |
weak_ptr | X (소유권 없음) | shared_ptr의 객체만 관찰 | 없음 | 관련 shared_ptr들이 모두 사라졌을 때 해제 | 없음 | 순환참조 해결용. 관찰만 가능 |
📎[C/C++ 강좌] 96강. 스마트 포인터
강의가 어려워서 유튜브를 찾아봤다. 그치만 문제가 있는데.. 앞에 내용을 모르는게 많아서 30%만 이해도 아닌 단어가 익숙한 정도... 3일 동안 캠프 없으니까 유튜브 강의는 쉴 때 누워서 봐야겠다.