728x90
포인터 변수와 참조, Malloc과 New
참조자(reference)
- 실체가 있어야 하며 선언 즉시 할당되어야 한다. 즉 NULL, nullptr로 할당 불가능하다.
- 레퍼런스는 초기화리스트를 사용하여 먼저 초기화해야하는데(modern c++의 초기화리스트와는 다르다. 생성자의 초기화리스트를 의미한다.) 이는 생성자 내부에서의 초기화는 먼저 null로 생성한 뒤 값을 넣는 방식이기 때문이다. 또한 한번 할당하면 다른 곳에 재할당 불가능하다.
포인터(Pointer) 타입 변수
- 주소값을 저장할수 있는 타입의 변수이다.
- 실체가 없이 NULL이 가능하며, 언제든 할당할 수 있다. 또한 동적 메모리 할당에 사용된다.
Malloc과 New의 차이
- Malloc : 단순한 메모리 할당, 할당 시 메모리의 사이즈를 입력해서 할당받는다. Malloc은 void*를 리턴하기 때문에 원하는 타입으로 캐스팅해서 사용한다.
- New : 할당과 동시에 초기화 가능하다(초기값을 줄 수 있다.).
댕글링 포인터
- 참조하고 있는 메모리 블록이 이미 해제된 포인터를 의미한다.
- 포인터 변수를 delete나 free 할 시에 메모리가 할당 해제되었다 해도 변수가 가리키는 주소값이 사라지는 것이 아니기 때문에, 그 포인터 변수를 다시 참조하려고 하면 미정의 동작을 수행한다.
- 메모리를 해제하는 구문 이후, 해당 포인터 변수를 nullptr로 바꿔주고 사용할 때마다 nullptr인지 체크하는 테크닉이 필요하다.
- 비주얼 스튜디오의 경우, 메모리를 해제하면 0x0823 같은 메모리로 치환하여 강제 크래시를 유발하기도 한다.
스마트 포인터
- C++에서 동적 메모리 관리를 자동화하기 위해 제공되는 템플릿 클래스이다.
- 스마트 포인터는 소멸자를 통해 자동으로 메모리를 해제하여 메모리 누수(Memory Leak)와 댕글링 포인터(Dangling Pointer) 문제를 방지한다.
- C++ 표준 라이브러리에서는 여러 종류의 스마트 포인터를 제공한다.
- std::unique_ptr
- std::shared_ptr
- std::weak_ptr
- std::unique_ptr
- 단일 소유권을 가진 스마트 포인터이다.
- 하나의 unique_ptr만 특정 메모리 블록을 소유할 수 있으며, 소유권을 다른 unique_ptr로 이동할 수 있다. 이동은 가능하지만 복사는 허용되지 않는다.
- std::shared_ptr
- 여러 개의 스마트 포인터가 같은 메모리 블록을 공유할 수 있게 한다.
- 참조 계수(reference count)를 사용하여 소유권을 관리한다.
- 마지막 shared_ptr이 소멸되면 메모리가 해제된다.
- std::weak_ptr
- shared_ptr이 소유한 메모리를 참조하지만, 소유권을 갖지 않는 스마트 포인터이다.
- weak_ptr는 참조 계수를 증가시키지 않으므로, 순환 참조(Circular Reference)를 방지하는 데 유용하다.
- 스마트 포인터의 장점
- 메모리 누수 방지
- 스마트 포인터는 소멸자를 통해 자동으로 메모리를 해제하여 메모리 누수를 방지한다.
- 안전한 메모리 관리
- 포인터의 유효성을 관리하여 댕글링 포인터와 같은 문제를 방지한다.
- 참조 계수 관리
- std::shared_ptr 는 참조 계수를 사용하여 메모리의 생존 시간을 관리한다.
- 자동 해제
- 범위를 벗어날 때 자동으로 메모리를 해제하여 명시적인 해제 코드가 필요 없다.
- 메모리 누수 방지
728x90
'언어 > C++' 카테고리의 다른 글
Set / Unordered Set (0) | 2024.06.18 |
---|---|
STL 컨테이너 (0) | 2024.06.16 |
플러시(Flush) (0) | 2024.04.19 |
C++ 입출력 성능 향상 (0) | 2024.04.19 |
#Pragma pack (0) | 2024.04.13 |