메모리 동적 할당
위키백과, 우리 모두의 백과사전.
|
|
이 문서의 내용은 출처가 분명하지 않습니다. 지금 바로 이 문서를 편집하여, 참고하신 문헌이나 신뢰할 수 있는 출처를 주석 등으로 표기해 주세요. 검증되지 않은 내용은 삭제될 수도 있습니다. 내용에 대한 의견은 토론 문서에서 나누어 주세요. |
메모리 동적 할당 또는 동적 메모리 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 이것은 프로그램이 실행되기 전 컴파일 단계에서 미리 프로그램이 사용할 메모리 크기를 계산하여 변수의 배치가 이루어지는 스택 등의 정적 메모리 할당과 대조적이다.
동적으로 할당된 메모리 공간은 프로그래머가 명시적으로 해제하거나 쓰레기 수집이 일어나기 전 까지 그대로 유지된다. 이 역시 함수가 종료되거나 스코프를 벗어나면 자동으로 공간 해제가 이루어지는 정적 메모리 할당과 대조적이다.
메모리는 힙 영역에 할당된다.
목차 |
장점과 단점 [편집]
- 장점: 상황에 따라 원하는 크기만큼의 메모리가 할당되므로 경제적이며, 이미 할당된 메모리라도 언제든지 크기를 조절할 수 있다.
- 단점: 더 이상 사용하지 않을 때 명시적으로 메모리를 해제해 주어야 한다.
동적 할당 방법 [편집]
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# 언어 [편집]
기본적으로 클래스와 인터페이스 형식의 인스턴스는 모두 동적 할당된다.
함께 보기 [편집]
| 이 글은 컴퓨터에 관한 토막글입니다. 서로의 지식을 모아 알차게 문서를 완성해 갑시다. |