ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 배열의 동적 할당
    컴퓨터 공학/C++ 2023. 3. 22. 19:53

    백준 9063번을 풀던 중 TC가 뭔가 하나 틀리는 게 있는데 찾질 못하겠어서 다른 사람의 풀이를 봤는데.. 생각지 못한 수확이 있었다. 못보던 C++ 스타일의 배열의 동적할당이 있었던 것이다. 지금까지 당연히 malloc으로만 가능한 줄 알았고 그렇게만 사용해왔는데 너무 충격적이었고 당연히 C++에서는 더 편리한 동적할당이 있을 거라고 생각지 못한 내 자신에게 더 충격을 받았다. 그래서 메모도 하고 복습도 할 겸 포스팅을 하려 한다.

     

    C 스타일의 배열의 동적할당

    malloc()이라는 <stdlib.h> 라이브러리 내에 있는 정의된 함수를 이용한다.

     

    e.g)

    int *arr = (int*)malloc(sizeof(int) * (할당하고싶은 크기));

     

    근데 이녀석은 할당을 해주었기 때문에 제거해주지 않는 이상 계속 남아있어 메모리를 차지하게 된다. 따라서 free()라는 할당 해제 함수를 세트로 사용해주어야 한다.

     

    e.g)

    free(arr);

     

    2차원 배열은 조금 더 복잡하다.

     

    e.g)

    int **arr = (int**)malloc(sizeof(int*) * row);

    for (int i = 0; i < row; i++) {

      arr[i] = (int*)malloc(sizeof(int) * column);

    }

    약간 헷갈릴 수 있는데(나는 좀 헷갈렸음 ㅎ) 2차원 배열을 직접 그려서 해보면 감이 온다.

     

    이녀석도 당연히 free()로 해제를 해주어야 하는데 1차원 배열처럼 넣기만 하면 안된다. 방 하나하나에 다 malloc()을 해놨으니까 뺄 때도 하나하나 빼주어야 하는 것.

     

    e.g)

    for (int i = 0; i < height; i++) {

      free(arr[i]);

    }

    free(arr);

    원리는 할당할 때랑 같다고 보면 된다.

     

    C++ 스타일의 배열의 동적할당

    e.g)

    int* arr = new int[(할당하고싶은 크기];

    이게 끝. 바로 예로 보여주어도 될 만큼 너무 간단하다. 그런데 new를 쓰길래 Java 생각이 나서 클래스랑 뭔가 관련이 있나? 해서 찾아보았는데, 그냥 연산자인 듯 하다.

     

    마찬가지로 이녀석도 할당을 해주었으니 free()처럼 해제 또한 해주어야 한다.

    e.g)

    delete[] arr;

     

    이차원 배열은 C 스타일이랑 방식이 완전 똑같다. 연산자만 바꿨다고 생각하면 된다. 해제도 마찬가지.

     

    슈퍼 간단. 오늘부터 동적할당은 이거다.

    '컴퓨터 공학 > C++' 카테고리의 다른 글

    endl과 \n 차이  (0) 2023.04.03
    string  (0) 2023.03.31
    binary_search()  (0) 2023.03.29
    배열의 길이  (0) 2023.03.10
    reverse()  (1) 2023.03.09
Designed by Tistory.