Dangling Pointer (feat. Memory Map)

2020. 3. 1. 18:25·C/C

 

1. 정의

메모리에서 해제 된 공간(ex. free(ptr))을 가리키는 포인터 (허상 포인터)

 

2. 발생 원인

  • free를 통해 메모리를 해제했지만 해당 포인터변수가 해제된 메모리 주소를 가지고 있는 경우.
  • 블록 스코프 내에서(ex. 임의의 함수 내에서) 할당된 변수의 주소를 가리키고 블록이 끝난 경우

Block Scope (함수의 종료 시점) 를 벗어날 때 result_p가 가리키는 주소는 이미 메모리에서 해제된 공간이다.

 

3. 증상

Segmentation fault

memory access deny -> 예측 불가능한 동작

 

4. 해결 방법

  • free 할 경우 메모리 해제 이후 해당 포인터변수를 자동으로 NULL을 가리키게한다.
free(ptr)
ptr = NULL;
  • Dangling Pointer 문제를 자동으로 발견하게 해주는 third party tool 사용

 

 

 

 

5. 예제

free해도 Dangling Pointer가 되지 않는 경우

 

포인터변수 dp가 name의 주소(name 의 메모리는 현재 stack에 존재함) 를 가리키기 때문에 free해도 dangling pointer 상태가 되지 않는다.

stack segment에 할당된 변수는 block scope를 벗어나는 시점에 자동으로 해제된다.
반면, free를 통한 명시적 메모리 해제는 Heap Segment에 할당된 주소를 해제할 때 쓰인다.
⚠️ free로는 stack segment에 할당된 변수를 해제할 수 없다.

 

memory map


 

[Dangling Pointer 문제 발생 예제]

15의 값을 가졌던 dp2 가 free 이후 읽어보니 쓰레기값 '10753056'을 갖는다


 

문제 해결

free 이후 포인터 변수 dp2에 NULL을 대입한다. (*dp2의 참조 문장은 접근되지 않는다 ∵ dp2 has a NULL pointer)

 

📝 결론

C++ 이나 JAVA에서의 new- delete도 malloc - free와 맥락을 같이하니

Dangling Pointer 발생을 예방하여 메모리 문제 발생을 방지하자!

 

저작자표시 (새창열림)

'C > C' 카테고리의 다른 글

매크로함수 (feat. SWAP)  (0) 2020.03.04
main 함수 (feat. argc, argv)  (0) 2019.11.10
파일 입출력 fopen  (0) 2019.11.10
Memory Map 이해하기(Feat.성적처리 프로그램 소스)  (0) 2019.10.02
2차원 배열 이해  (0) 2019.09.29
'C/C' 카테고리의 다른 글
  • 매크로함수 (feat. SWAP)
  • main 함수 (feat. argc, argv)
  • 파일 입출력 fopen
  • Memory Map 이해하기(Feat.성적처리 프로그램 소스)
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (432)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (70)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (13)
        • git (19)
        • 잡동사니 (27)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    C++
    Kotlin
    javascript
    docker
    android
    PostgreSQL
    algorithm
    프로그래머스
    linux
    백준
    Bitcoin
    ubuntu
    JPA
    Programmers
    java
    Spring
    database
    kafka
    Git
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
Dangling Pointer (feat. Memory Map)
상단으로

티스토리툴바