CSAPP 9장 가비지 컬렉터, 메모리 관련 오류

Baedonguri·2022년 5월 3일
0
post-thumbnail

가비지 컬렉션 (Garbage collection)

  • 쓰레기 수집이라는 의미, 여기서 쓰레기는 당연히 해제되어야할 메모리 블록(영역)을 말함
  • 이 일을 수행하는 것이 바로 가비지 컬렉터(Garbage Collector)
  • 메모리가 일정량 차오르거나 쓰레기를 수거할 필요가 있을 때 가비지 컬렉터가 출동해서 쓰레기를 수거한다.
    ->여기서 메모리는 힙 메모리를 뜻함

지역변수와 같이 스택에 할당되는 값은 자신의 scope를 벗어나면 사라지는 특성을 가지고 있어서 해제에 대한 신경을 써주지 않아도 되지만
heap에 할당되는 메모리를 생각해보면, 해당 메모리를 가리키는 포인터 또는 참조 변수가
사라진다고 해서 heap에 할당된 메모리가 자동으로 해제되지 않으니
프로그래머가 직접 free를 통한 해제를 해주어야 한다.

java와 c#은 가비지 컬렉터를 제공해서 자동으로 해주지만
c,c++은 제공해주지 않음

하지만 가비지 컬렉션에는 단점이 존재한다.
일단 가비지 컬렉터는 실시간으로 사용되지 않는 메모리를 지워주는 것이 아니다.
위에서 설명했듯이 주기적으로 돌면서 확인하고 지우는 것이기 때문에 사용되지 않는 메모리가 지워지지 않고 남아있을 수 있다.
이 말은 프로그램이 종료될 때까지 사용되지 않는 메모리가 남아있을 수 있다는 말이다.
따라서 가비지 컬렉터는 메모리 누수를 완벽하게 막지 못할 수 있다.

메모리 관련 오류들

9.11.1 잘못된 포인터의 역참조

  1. 포인터로 프로세스의 가상 주소공간 내에 매핑되지 않은 공간을 역참조 할 경우
    segmetation fault란 잘못된 메모리 참조 때문에 발생하는데,
    주로 NULL영역을 건드리거나, 할당 받은 메모리공간을 넘은 곳을 건드렸을 때, 발생하게 된다.

    A : null값을 가리키는 포인터에 접근하는 경우

    ```
    int main(){
    int* myptr = NULL;
    *myptr = 3;
    }
    ```

    B : 더 이상 존재하지 않는 메모리 영역을 가리킬 때

    int main(){
     char* myptr = NULL;
     {
         char c = '3';
         myptr = &c;
     }
     //block이 끝나서 c의 수명은 끝났는데 myptr은 여전히 c를 가리키고 있음
     *myptr = 'G'; //여기서 segfault!
    	}

    C :Read-Only 메모리 영역에 쓰려고 할 경우

    int main(){
        char* myptr = "hello! world!";
        *myptr = 'h';
    }

D : 할당 받은 메모리 공간을 넘은 곳을 건드린 경우

int *p = new int[5];
p[5] = 11; // 여기서는 에러가 발생하지 않는다.
delete p;  // 여기서 에러 발생.

스택 버퍼 오버플로우와 gets

profile
Software Engineer

0개의 댓글