이번 포스팅에서는 자료구조에 대해서 알아보겠습니다.

따로 수업이 열릴 정도로 방대한 분량의 내용이지만, 카테고리가 기초 C++이기 때문에 간략하게만 확인하고 넘어갑니다!

 

목차


    0. 메모리 구조

    전에 heap과 stack에 대해서 간략하게 말한 적이 있습니다.

    동적으로 생성한 요소는 heap에 저장되고, 정적으로 생성한 요소는 stack에 저장된다는 이야기를 했었습니다.

    heap에 저장된 요소들은 delete 처리를 해 주지 않으면 계속해서 메모리를 사용하기 떄문에 메모리 누수(memory leak)현상이 발생하기 때문에 new로 생성한 요소들의 경우 제대로 delete를 했는 지 반드시 확인해 줄 필요가 있습니다.

     

    아래 예시를 간단하게 설명드리면,

    첫 번째는 정적 배열이기 때문에 delete를 할 수 없습니다. (1~2줄)

    두 번째는 정상적으로 작동합니다. (3~4줄)

    세 번째는 이미 지웠기 때문에 다시 지울 수 없습니다. (5줄)

    네 번째는 정상적으로 작동합니다. (6~7줄)

    마지막은 이미 지운 요소를 불러오려고 하기 때문에 오류가 발생합니다 (8줄)

     


    1. 연결 리스트

    객체 안에 다음 요소를 향한 포인터가 내장되어 있는 경우가 있습니다.

    이것을 연결 리스트라고 부릅니다.

     

    이 연결리스트의 경우 vector의 iterator기능과 거의 유사하다고 볼 수 있습니다.

    또한, next 포인터 이외에도 tail이나 prev 포인터를 이용하여 다른 곳을 가리키는 정보도 담을 수 있습니다.

    자료의 크기는 조금 커지겠지만, 접근 시간이 줄어들어서 더 효율적으로 처리할 수도 있습니다.

     

    아래 예시는 seq1에서 head와 tail이 가리키는 주소를 바꾸어서 새롭게 할당하는 예시입니다.

     

    이 연결리스트를 제대로 이해한다면, 포인터가 가리키는 요소에 다른 값을 할당하거나, 요소를 삭제해야 하는 경우의 메모리 변화도 정확하게 이해하실 수 있습니다.

     

    아래는 값을 복사하고 swap한 후에 temp에 있는 요소를 지우는 과정입니다.

     


    이번 포스팅의 내용이 굉장히 짧죠?

    Rvalue Reference와 Smart Pointer에 대한 내용이 추가로 존재하지만, 이 부분은 C++을 처음 배우는 입장에서 이해하기 조금 어려운 부분일 수 있기 때문에 추후에 작성하도록 하겠습니다. (아마 이곳에 추가가 될 지도 모릅니다..)

     

    그렇다면 다음 포스팅에서 뵙도록 하겠습니다! 감사합니다 :)

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기