스마트 포인터와 new에서의 메모리 릭

보물창고·2021년 7월 28일
0

스마트 포인터

=> 자체가 동적할당이다. 타겟으로 잡은 객체는 힙메모리에 할당된다.

c++에서의 가비지 컬렉터라고 할 수 있다.
알아서 해제가 진행된다.

  • 특징
    1) RAII (Resource Acquisition is Initialization)그러니까, 자원 획득은 초기화라는 의미로,// 리소스의 라이프 사이클과 오브젝트의 라이프 사이클을 일치시킨다 라는 의미이다.
    -> 생명주기는 스코프 내에서만 , 스코프를 벗어나면 포인터와 리소스가 함께 해제가 된다는 것이다.
    -> 포인터는 스택에 있어서 프로그램이 종료되면 자동으로 지워지지만, new로 할당된 메모리는 자동으로 지워지지 않고, delete를 해야 해제가 된다.

여기서의 리소스는 힙 메모리이다.

사용해야만 하는이유

: new ~ delete에서 해제를 유저가 직접 해야하는데,
모르고 안해준다거나, 중간에 반환함으로써 memory Leak이 생길수 있다.
스마트 포인터로 할당한다면 스택에 스마트 포인터가 있고, 힙에 메모리 할당되며, 프로그램이 종료될 때 스마트 포인터가 없어지면서 자동으로 힙에 할당된 메모리도 제거된다.
-> 이점 : memory Leak을 방지한다.

기본 동적 할당에서 메모리 릭이 발생하는 이유


-> 스택에 있는 포인터는 제거되지만, 힙에 할당된 리소스를 가리키는 포인터가 제거됨으로서 할당된 메모리는 접근이 불가능하다.
유저가 할당된 메모리를 사용하지 못하고, 이를 메모리 릭이라고 한다.

  • 스마트 포인터를 사용하면

    -> 해제를 하지 않앗는데도 소멸자가 호출되는 것을 확인할 수 있다.

  • 스코프 안에서만 유지된다.

배열을 스마트포인터로 나타내면 vector이다.

  • 문제 유발 코드

    -> 배열로 동적할당했는데, 해제를 단일로 하니까 컴파일 에러 발생한 것이다.

  • 정상적인 코드

  • vector를 사용하면 유저가 굳이 해제할 필요가 없다.
    noexcept는 예외처리할수 있으니까 추가함.

profile
🔥🔥🔥

0개의 댓글