[C++] 동적할당

2024. 2. 4. 08:26·Programming Language(Sub)/C++

동적할당(Dynamic allocation)


동적할당(Dynamic allocation)이란

  • 동적으로 할당되지 않은 변수의 경우

    • 지역변수 : 지역변수가 속한 함수가 시작할 때 생성되고, 종료되면 소멸됨

    • 전역변수 : 프로그램 시작과 동시에 생성되고, 종료되면 소멸됨

  • 동적 할당 dynamic allocation : 프로그램 실행 중에 변수를 메모리에 할당하는 것

변수 동적할당

int main(void) {
    // int a = int(5);
    int *a = new int(5);  // new 는 연산자.
                          /*
                          작동원리:
                          int(5)에서 메모리 상에 인트형을 저장하는 공간이 생겨나 5가 들어감(200번지). new가 이 공간의 주솟값(200번지)을 a에 넘겨줌.
                          */
    cout << a << endl;
    cout << *a << endl;
    *a = 10;
    cout << a << endl;
    cout << *a << endl;

    delete a; // 메모리 해제
}
  • (new) (자료형의 생성자) 를 통해 할당

  • delete (포인터명)를 통해 메모리 해제

  • 작동 원리

    • new int(5)에서 메모리 상에 int형을 저장하는 공간이 생기고 5가 저장됨

    • 새로 생긴 공간의 주소값이 a에 저장됨

배열의 동적할당

  • 기본적으로 배열의 경우 컴파일 시간에 크기가 결정됨

  • 동적할당을 통해 배열의 크기를 동적으로 정할 수 있다

// 동적할당을 사용하지 않으려면 int arr[1000]; 처럼 넉넉히 할당해야 함
#include <iostream>

using namespace std;

int main(void) {
    int *arr;
    int len;
    cout << "동적할당할 배열의 길이 입력: ";
    cin >> len;
    arr = new int[len];  // int(5), int[len] 이런 차이.
    for (int i = 0; i < len; i++) {
        arr[i] = len - i;
    }
    for (int i = 0; i < len; i++) {
        cout << arr[i] << endl;
    }

    delete[] arr;  // delete arr하면 배열 첫번째 칸만 삭제됨.
}
  • 주의점 : 동적할당된 배열의 메모리를 해제하려면 delete가 아닌 delete[] 를 사용해야 함

객체의 동적할당

#include <iostream>
using namespace std;

class Vector2 {
   public:
    Vector2() : x(0), y(0) {
        cout << this << " : Vector2()" << '\n';
    }
    Vector2(const float x, const float y) : x(x), y(y) {
        cout << this << " : Vector2(float x, float y)" << '\n';
    }

    ~Vector2() {
        cout << this << " : ~Vector2()" << '\n';
    }

    float GetX() const {
        return x;
    }
    float GetY() const {
        return y;
    }

   private:
    float x;
    float y;
};

// 직접 실행하여 생성과 소멸 순서 알아보기
int main(void) {
    Vector2 s1 = Vector2();
    Vector2 s2 = Vector2(3, 2);
    Vector2 *d1 = new Vector2();
    Vector2 *d2 = new Vector2(3, 2);

    cout << "(" << d1->GetX() << ", " << d1->GetY() << ")" << '\n';
    cout << "(" << d2->GetX() << ", " << d2->GetY() << ")" << '\n';
    delete d1;
    delete d2;
}
  • 동적할당된 변수들이 먼저 소멸되고, s1, s2가 그 다음 소멸된다.

  • 소멸은 선언의 역순이기도 함.

참조) 두들낙서 C/CPP 강의

'Programming Language(Sub) > C++' 카테고리의 다른 글

[C++] 복사 생성자 오버로딩  (0) 2024.03.12
[C++] 깊은 복사와 얕은 복사(Deep Copy, Shallow Copy)  (0) 2024.03.12
[C++] 연산자 오버로딩  (0) 2024.02.04
[C++] 멤버 메서드의 활용  (0) 2024.02.04
[C++] 상수형 매개변수와 상수형 메서드  (0) 2024.02.04
'Programming Language(Sub)/C++' 카테고리의 다른 글
  • [C++] 복사 생성자 오버로딩
  • [C++] 깊은 복사와 얕은 복사(Deep Copy, Shallow Copy)
  • [C++] 연산자 오버로딩
  • [C++] 멤버 메서드의 활용
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[C++] 동적할당
상단으로

티스토리툴바