메모리 동적 할당

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 찾기

메모리 동적 할당 또는 동적 메모리 할당컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 이것은 프로그램이 실행되기 전 컴파일 단계에서 미리 프로그램이 사용할 메모리 크기를 계산하여 변수의 배치가 이루어지는 스택 등의 정적 메모리 할당과 대조적이다.

동적으로 할당된 메모리 공간은 프로그래머가 명시적으로 해제하거나 쓰레기 수집이 일어나기 전 까지 그대로 유지된다. 이 역시 함수가 종료되거나 스코프를 벗어나면 자동으로 공간 해제가 이루어지는 정적 메모리 할당과 대조적이다.

메모리는 영역에 할당된다.

목차

장점과 단점 [편집]

  • 장점: 상황에 따라 원하는 크기만큼의 메모리가 할당되므로 경제적이며, 이미 할당된 메모리라도 언제든지 크기를 조절할 수 있다.
  • 단점: 더 이상 사용하지 않을 때 명시적으로 메모리를 해제해 주어야 한다.

동적 할당 방법 [편집]

C 언어 [편집]

C 언어에서는 malloc, calloc 함수로 동적 할당한다. 플랫폼에 따라서 farmalloc, farcalloc와 같은 원거리 포인터 할당 함수를 지원하기도 한다.
realloc 함수로 재할당하며 free 함수로 해제한다.

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
 
void main()
{
    unsigned char near * pMemory = 0;
    unsigned char far * lpMemory = 0;
    printf("할당할 근거리 메모리 크기를 입력해 주세요. ==> ");
    int size;
    printf("\n");
    scanf("%d", &size);
    pMemory = (char near *)malloc(size);
    printf("할당할 원거리 메모리 크기를 입력해 주세요. ==> ");
    scanf("%d", &size);
    printf("\n");
    lpMemory = (char far *)farmalloc(size);
 
    printf("원거리 메모리 해제합니다.\n");
    farfree(lpMemory)
    printf("근거리 메모리 해제합니다.\n");
    free(pMemory);
 
}

C++ 언어 [편집]

언어 차원에서 new, delete 연산자를 통해 동적 할당을 제공한다. 재할당 연산자는 현재까지 없으며, 여전히 C 함수를 사용 할 수 있다. new와 delete 연산자는 내부적으로 malloc()과 free()와 유사한 함수를 사용하여 메모리 맵상의 힙영역으로 부터 저장공간을 할당한다.

class Test
{
private:
    int _data;
 
public:
    Test() : _data(0) { }
    Test(int data) { this->_data = data; }
 
    int getData() { return _data; }
};
 
void main()
{
    Test * pMemory = 0;
 
    cout<<"할당할 메모리 크기는? == ";
    int size;
    cin>>size;
    cout<<endl;
 
    pMemory = new Test[size];
 
    // 확보한 공간을 사용한 후...
 
    cout<<"할당된 메모리가 해제됩니다."<<endl;
 
    delete[] pMemory;  
 
    pMemory = new Test(10);
    cout << pMemory->getData() << endl;
    delete pMemory;
}

C++/CLI 언어 [편집]

new 연산자 이외에 닷넷 기반의 관리되는 힙에도 동적 할당을 할 수 있다. 이 경우 연산자는 gcnew이다. 해제는 delete 연산자로 동일하다.
관리 힙에 할당하려면 형식이 관리되는 형식이어야 한다.

using namespace System;
 
namespace NetTest
{
    public ref class Type
    {
        private:
        unsigned long _data;
        public:
        Type(unsigned long data) { this->_data = data; }
 
        property unsigned long Data
        {
            unsigned long get() { return this->_data; }
        }
    }
}
 
void _tmain()
{
    ::NetTest::Type^ pType = nullptr;
    cli::array<::NetType::Type ^, 1>^ pTypeArray = nullptr;
 
    Console::Write(L"할당할 메모리의 크기는?");
 
    unsigned long size = Console::Read();
 
    Console::Write("\n");
 
    pTypeArray = gcnew cli::array<::NetType::Type ^, 1>(size);
 
    Console::WriteLine(L"할당된 메모리가 해제됩니다.");
    delete[] pTypeArray;
 
    Console::WriteLine(L"단일 객체가 생성됩니다.");
    pType = gcnew ::NetTest::Type();
    Console::WriteLine(L"할당된 객체가 해제됩니다.");
    delete pType;
}

C# 언어 [편집]

기본적으로 클래스와 인터페이스 형식의 인스턴스는 모두 동적 할당된다.

함께 보기 [편집]