동적 메모리 할당 C ++로 작업하는 방법?



이 기사에서는 실시간 리소스에 대한 메모리 요구 사항을 고려할 수있는 중요한 기능인 C ++의 동적 메모리 할당을 살펴 봅니다.

C ++의 동적 메모리 할당은 실시간 리소스에 대한 요구 사항을 처리하기위한 요구 사항을 고려할 수있는 매우 중요한 기능입니다. 이 기사에서는 자세히 탐색. 이 기사에서는 다음과 같은 포인터를 다룰 것입니다.

이제 C ++의 동적 메모리 할당에 대한이 기사를 시작하겠습니다.





동적 메모리 할당이 필요하십니까?

예를 들어 문장을 문자 배열로 입력하고 싶지만 배열에 필요한 정확한 문자 수를 확신 할 수 없습니다.

이제 문자 배열을 선언하는 동안 원하는 문자열의 크기보다 작은 크기를 지정하면 배열에 할당 된 메모리의 공간이 입력 문자열의 크기에 비해 작기 때문에 오류가 발생합니다. 입력 문자열의 크기보다 큰 크기를 지정하면 배열에 원하는 문자열의 크기보다 훨씬 큰 메모리 공간이 할당되므로 필요하지 않은 경우에도 불필요하게 더 많은 메모리를 소비합니다.



위의 경우에는 컴파일 시간 (컴퓨터가 코드를 컴파일하고 사용자가 문자열을 입력 할 때)까지 배열의 정확한 크기에 대한 아이디어가 없습니다. 이러한 경우 우리는 새로운 운영자.

C ++는 두 개의 단항 연산자를 정의합니다. 새로운지우다 런타임 동안 메모리 할당 및 할당 해제 작업을 수행합니다. 이러한 연산자 (새로 만들기 및 삭제)는 사용 가능한 저장 메모리 (힙 메모리)에서 작동하므로 사용 가능한 저장 연산자라고도합니다. 포인터는 C ++에서 동적 메모리 할당 시스템에 필요한 지원을 제공합니다.

동적 할당의 도움으로 프로그램은 런타임 중에 메모리를 얻을 수 있습니다.



전역 및 지역 변수는 컴파일 타임 동안 메모리에 할당됩니다. 그러나 런타임 중에는 전역 또는 지역 변수를 추가 할 수 없습니다. 프로그램이 가변적 인 양의 메모리를 사용해야하는 경우 런타임 중에 필요할 때 메모리를 할당해야합니다. 물론 여기에서 동적 할당 루틴이 그 목적을 달성 할 수 있습니다.

정적 메모리 할당과 동적 메모리 할당의 차이점 :

이것은 모든 C ++ 프로그램에 사용되는 기본 메모리 아키텍처입니다.

메모리-동적 메모리 할당-Edureka

이런 이미지가 필요합니다

스택은 정적 메모리 할당에 사용되고 힙은 동적 메모리 할당에 사용되며 둘 다 컴퓨터의 RAM에 저장됩니다.

정적 메모리 할당이 메모리에 직접 저장되고이 메모리에 대한 액세스가 매우 빠르면서 스택에 할당되는 변수는 프로그램이 컴파일 될 때도 처리됩니다. 함수 나 메서드가 다른 함수를 호출하는 등 다른 함수를 호출 할 때 마지막 함수가 해당 값을 반환 할 때까지 이러한 모든 함수의 실행이 일시 중단 된 상태로 유지됩니다. 스택은 항상 LIFO (last in first out) 순서로 저장되며 가장 최근에 예약 된 블록은 항상 해제 될 다음 블록입니다. 이것은 스택을 추적하는 데 도움이되며 스택에서 블록을 해제하는 것은 하나의 포인터를 조정하는 것에 지나지 않습니다.

힙에 할당 된 변수에는 동적 메모리 할당 동안 런타임에 메모리가 할당됩니다. 이 메모리에 액세스하는 것은 스택에 비해 약간 느리지 만 힙의 크기는 가상 메모리의 크기에 의해서만 제한됩니다. 힙의 요소는 서로 종속성이 없으며 언제든지 임의의 시간에 액세스 할 수 있습니다. 우리는 언제든지 블록을 할당하고 언제든지 해제 할 수 있습니다. 이로 인해 주어진 시간에 힙의 어떤 부분이 할당되거나 할당 해제되었는지 추적하기가 어렵습니다.

C ++의 동적 메모리 할당에 대한이 기사로 이동

다음을 사용하여 메모리 할당 새로운 예어

C ++에서 새로운 연산자는 런타임에 메모리를 할당하는 데 사용되며 메모리는 바이트 단위로 할당됩니다. 그만큼 새로운 연산자는 힙에 대한 동적 메모리 할당 요청을 나타냅니다. 충분한 메모리를 사용할 수있는 경우 새로운 연산자는 메모리를 초기화하고 새로 할당되고 초기화 된 메모리의 주소를 포인터 변수에 반환합니다.

통사론:

데이터 유형 * pointer_name = 새 데이터 유형

예:

int * ptr = new int // 다음 두 가지 방법으로 동적 할당 중에 변수를 선언 할 수 있습니다. int * ptr = new int (10) int * ptr = new int {15} // new operator는 데이터 형 메모리 블록 (배열)을 할당하는 데에도 사용됩니다. int * ptr = new int [20] // 위 명령문은 int 유형의 정수 20 개에 대한 메모리를 동적으로 할당하고 시퀀스의 첫 번째 요소에 대한 포인터를 'ptr'포인터에 반환합니다.

노트 : 힙에 할당 할 메모리가 충분하지 않은 경우 new 연산자와 함께 'nothrow'를 사용하지 않는 한 새 요청은 std :: bad_alloc 예외를 throw하여 실패를 나타냅니다.이 경우 NULL 포인터를 반환합니다. 따라서 프로그램에서 사용하기 전에 new에 의해 생성 된 포인터 변수를 확인하는 것이 좋습니다.

자바 개발을위한 최고의 IDE

C ++의 동적 메모리 할당에 대한이 기사로 이동

다음을 사용하여 메모리 할당 해제 지우다 예어:

힙 메모리가 변수 또는 클래스 개체에 할당되면 새로운 키워드를 사용하여 해당 메모리 공간을 할당 해제 할 수 있습니다. 지우다 예어.

통사론:

delete pointer_variable // 여기서 pointer_variable은 new에 의해 생성 된 데이터 객체를 가리키는 포인터입니다. delete [] pointer_variable // pointer-variable이 가리키는 동적으로 할당 된 배열 메모리를 해제하려면 다음과 같은 삭제 형식을 사용합니다.

예:

ptr 삭제 [] ptr 삭제

노트 : 객체의 범위 또는 객체의 수명은 프로그램이 실행되는 동안 객체가 메모리에 남아있는 시간입니다. 힙 메모리 할당은 스택보다 느립니다. 힙에서는 메모리를 할당 할 수있는 특별한 순서가 없지만 스택에서는 LIFO를 따릅니다.

C ++의 동적 메모리 할당에 대한이 기사로 이동

동적으로 배열 할당

동적 메모리 할당 개념의 주요 용도는 크기를 지정하여 선언해야하지만 확실하지 않은 경우 배열에 메모리를 할당하는 것입니다.

사용법을 이해하는 예를 살펴 보겠습니다.

#include using namespace std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // 동적 메모리 할당 cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (marks + i)} for (int i = 0 i

설명:
이 예에서는 먼저 사용자에게 클래스의 학생 수를 묻고 그 값을 len 변수에 저장합니다. 그런 다음 정수 배열을 선언하고 다음 문을 사용하여 len 변수에 저장된 값과 동일한 메모리 공간을 동적으로 할당합니다. int * marks = new int [length] 따라서 'length * (size of 1)와 같은 공간이 할당됩니다. 정수)'. 나머지 코드는 자명합니다.

C ++의 동적 메모리 할당에 대한이 기사로 이동

개체에 대한 동적 메모리 할당

객체를 동적으로 할당 할 수도 있습니다.

Constructor는 객체를 초기화하는 데 사용되는 특수 클래스 멤버 함수이며 Destructor는 객체가 범위를 벗어날 때마다 호출되는 클래스 멤버 함수입니다.

Tableau 개발자는 무엇을합니까

소멸자는 객체에 할당 된 메모리를 해제하는 데 사용할 수 있습니다. 다음과 같은 조건에서 호출됩니다.

  • 로컬 개체가 범위를 벗어난 경우
  • 전역 객체의 경우 클래스의 객체에 대한 포인터에 연산자가 적용될 때

객체에 동적으로 메모리를 할당하면서 포인터를 다시 사용할 수 있습니다.

객체 배열의 예를 살펴 보겠습니다.

#include 네임 스페이스 사용 std class Random {public : Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

산출:

설명:

생성자는 Random 클래스의 세 개체에 메모리를 할당하고 있으므로 세 번 호출됩니다. 소멸자는 이러한 각 개체 중에 세 번 호출됩니다. ‘Random * a = new Random [3]’이 문은 객체의 동적 메모리 할당을 담당합니다.

따라서 우리는 '동적 메모리 할당 C ++'에 대한이 기사를 마칩니다. 자세한 내용은 다음을 확인하십시오. 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 제공합니다. Edureka의 Java J2EE 및 SOA 교육 및 인증 과정은 Hibernate & Spring과 같은 다양한 Java 프레임 워크와 함께 핵심 및 고급 Java 개념 모두에 대해 교육하도록 설계되었습니다.

질문이 있으십니까? 이 블로그의 댓글 섹션에 언급 해 주시면 가능한 한 빨리 답변을 드리겠습니다.