C++ DynamicAllocation

m._.jooong·2023년 4월 26일
0

C++

목록 보기
20/23
#include <iostream>

/** 문자열 관련 라이브러리*/
#include <string>

/** C++ 표준 라이브러리 사용합니다. */
using namespace std;

int main()
{
   /**
   C++ 문법에서 자연스럽게 써야 하는 문법적 요소
   1. 포인터      Pointer
   2. 참조자      Reference
   3. 상수       Constant
   4. 동적할당     Dynamic Memory Allocation
   5. 스마트 포인터 Smart Pointer
           unique_ptr : 객체의 유일한 소유권을 가지는 스마트 포인트
           shared_ptr : 객체간의 공유가 가능한 스마트 포인터
           weak_ptr   : shared_ptr의 순환참조 문제를 해결한 약한 참조의 스마트 포인터
   */

   /**
   Memory 영역은 다음과 같이 나뉘게 됩니다.

   Code : 실행한 프로그램의 코드가 저장됩니다.
   Data : 전역변수(Global Variable), 정적변수(Static Variable)가 저장되면
           프로그램 종료 시까지 사라지지 않고 남아있습니다.
   Stack : 지역변수와 매개변수가 할당되고 함수를 빠져나가면 자동 소멸됩니다.
   Heap : 동적으로 할당된 메모리 영역이며 프로그래머에 의해 할당 및 해제 됩니다.
   */

    // 매개 변수 : Parameter, 인수 (Argument)

    /**
    정적 메모리 할당과 동적 메모리 할당에 대해서 알아 봅니다.

    정적으로 메모리를 할당하면 컴파일시 stack영역에 할당되며, 함수를 빠져 나갈 때 소멸됩니다.
    프로그램 컴파일시 stack에 얼마만큼의 크기로 할당을 해야 하는지 결정되기 때문에
    컴파일 이후 크기를 변경할 수 없습니다.

    따라서 정적 배열 선언시 크기를 가변적으로 명시하면 문제가 될 수 있기 때문에;
    반드시 상수로 명시해야 합니다.
    */

    /** 문장을 추가해 줍니다. */
    int intValue1 = 10;
    const int intValue2 = 10;

    // 정적 배열 선언시 크기를 가변적으로 명시하면 문제가 될 수 있기 때문에
    // 반드시 상수로 명시해야 한다.
    //int intArr1[intValue1;]     // x
    int intArr2[intValue2];
    int intArr3[10];
    cout << endl;
    cout << endl;

    /**
    배열의 종류
    int intArray1[] = {1, 2, 3, 4, 5};          C언어의 배열
    arry<int, 5> intArray2 = {1, 2, 3, 4, 5};   C++ 언어의 배열
    */

    /**
    동적으로 메모리를 할당하는 경우 데이터가 heap영역에 할당됩니다.
    heap 메모리 영역은 프로그래머에 의해 할당(new 연산자)되거나 소멸(delete 연산자)됩니다.
    동적할당은 프로그래머가 원할 땨ㅐ 원하는 크기로 할당할 수 있습니다.
    포인터 변수는 stack에 할당됩니다.
    */

    /** 문장을 추가해 줍니다. */
    int intValue4 = 10;
    /** intArray4 포인터 변수는 stack에 할당되며, intArray1 배열은 heap에 할당됩니다. */
    int* intArray4 = new int[intValue4];

    cout << endl;
    cout << endl;

    /**
    C : malloc(말록, Memory Allocation) 함수와 free() 함수

    C++ : new 연산자와 delete 연산자

    정적 메모리는 컴파일시에 Stack 영역에 할당되고, 함수를 빠져나올 대 소멸됩니다.
    반면 동적 메모리는 런타임시에 프로그래머에 의해서 Heap 영역에 할당되고 소멸됩니다.
    할당시에는 new 연산자를 사용하며 소멸시에는 delete 연산자를 사용합니다.

    heap 영역에 동적 할당되는 메모리의 경우 사용이 끝난다면 반드시 delete를 해 주어야 합니다.
    참고로 동적 배열을 delete 하는 경우 배열이라는 것을 명시하기 위해 delete[] 연산자를 사용합니다.
    */

    /** 동적 할당*/
    int* intPtr1 = new int;
    int* intPtr2 = new int(3);
    int* intPtr3 = new int{ 5 };
    int* intPtr4 = new int();

    /** 배열의 동적 할당*/
    int* array1 = new int[5];

    /** 소멸 */
    delete intPtr1;
    delete intPtr2;
    delete intPtr3;
    delete intPtr4;

    /** 배열의 소멸 */
    delete[] array1;

    cout << "" << endl;
    cout << "" << endl;

    /**
   배열의 동적 할당에 대해서 알아 봅니다.

   정적 할당으로 배열을 선언하게 되면 사이즈가 정해져 버립니다.
   안 쓸 수도 있는데, 사이즈가 정해져 버립니다. 메모리 공간의 낭비가 심해집니다.
   */

   /** 문장을 추가해 줍니다. */

   /**
   사이즈가 1000개인 배열변수를 선언했습니다.
   만일 선언만 하고 안쓴다면 int타입은 4byte입니다. 4 * 1000 = 4000 byte의 비효율이 발생합니다.
   */
    int intArray5[1000];

    /**
    메모리 최적화를 위해서 동적 할당을 할 수 있습니다.
    배열에서는 사이즈도 원하는 사이즈로 동적 할당을 할 수 있습니다.
    */

    /** 문장을 추가해 줍니다. */
    int* intPtr8;
    int arrayLength = 10;

    intPtr8 = new int[arrayLength];

    for (int i = 0; i < arrayLength; i++)
    {
        intPtr8[i] = i;
    }

    for (int i = 0; i < arrayLength; i++)
    {
        cout << "intPtr8[" << i << "] : " << intPtr8[i] << endl;
    }

    /** 꼭 delete 연산자로 메모리에서 객체 해제를 해 주어야 합니다. */
    delete[] intPtr8;



}

0개의 댓글