언어/C++

포인터 변수와 참조, Malloc과 New

에린_1 2024. 6. 12. 22:18
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
  1. std::unique_ptr
    • 단일 소유권을 가진 스마트 포인터이다.
    • 하나의 unique_ptr만 특정 메모리 블록을 소유할 수 있으며, 소유권을 다른 unique_ptr로 이동할 수 있다. 이동은 가능하지만 복사는 허용되지 않는다.
  2. std::shared_ptr
    • 여러 개의 스마트 포인터가 같은 메모리 블록을 공유할 수 있게 한다.
    • 참조 계수(reference count)를 사용하여 소유권을 관리한다.
    • 마지막 shared_ptr이 소멸되면 메모리가 해제된다.
  3. std::weak_ptr
    • shared_ptr이 소유한 메모리를 참조하지만, 소유권을 갖지 않는 스마트 포인터이다.
    • weak_ptr는 참조 계수를 증가시키지 않으므로, 순환 참조(Circular Reference)를 방지하는 데 유용하다.
  • 스마트 포인터의 장점
    1. 메모리 누수 방지
      • 스마트 포인터는 소멸자를 통해 자동으로 메모리를 해제하여 메모리 누수를 방지한다.
    2. 안전한 메모리 관리
      • 포인터의 유효성을 관리하여 댕글링 포인터와 같은 문제를 방지한다.
    3. 참조 계수 관리
      • std::shared_ptr 는 참조 계수를 사용하여 메모리의 생존 시간을 관리한다.
    4. 자동 해제
      • 범위를 벗어날 때 자동으로 메모리를 해제하여 명시적인 해제 코드가 필요 없다.
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