C++의 동적 메모리 할당

C Ui Dongjeog Memoli Haldang



일반적으로 C++ 프로그래밍 언어로 소스 코드를 사용하는 동안 컴파일러는 데이터 저장을 위해 변수에 메모리를 수동으로 할당합니다. 정적 메모리 할당이라고 합니다. 한 번 선언하면 변경할 수 없는 고정 메모리입니다. 이러한 유형의 메모리 할당을 위해 운영 체제는 스택을 사용하여 데이터를 저장합니다. 정적 할당에서는 소스 코드가 실행되기 전에 메모리가 할당됩니다.

반면 동적 메모리 할당에서는 실행이 시작된 동안 메모리가 할당됩니다. 이 메모리는 C++에서 런타임 메모리 할당이라고도 하는 런타임 시 프로그래머가 수동으로 할당합니다. 동적 메모리의 크기는 선언할 때 고정할 수 있는 크기를 언급하지 않기 때문에 프로그램의 어느 위치에서나 변경할 수 있습니다. 변수에 직접 값만 제공합니다.

일반 변수에 대한 메모리 할당 차이

일반 변수에서 컴파일러에 의해 할당된 메모리는 자동으로 할당 및 할당 해제됩니다. 메모리가 프로그래머에 의해 동적으로 할당되면 소스 코드의 추가 실행에 사용되지 않는 메모리를 제거하거나 할당 해제해야 합니다. 이 상황은 메모리가 할당 해제되지 않은 상태에서 프로그램이 종료될 때 '메모리 누수'를 유발합니다.







동적 할당 연산자

C++에서 두 개의 연산자는 메모리 할당 및 할당 해제에 도움이 됩니다. 더 나은 방식으로 메모리 할당 및 할당 해제에 사용되는 'new' 및 'delete'입니다.



새 연산자

메모리 할당에 대한 요구를 나타냅니다. new 연산자는 메모리를 초기화하고 사용 가능한 메모리가 충분하면 할당된 메모리의 주소를 포인터 변수에 반환합니다.



포인터 개체 = 새로운 데이터 - 유형 ;

연산자 삭제

new 연산자와 마찬가지로 delete 연산자는 할당된 메모리를 제거하는 데 사용됩니다. C++에서 프로그래머는 할당 해제를 위해 이 연산자를 사용할 수 있습니다.





# pointer_variable 삭제;

예 1

이 예제에서는 두 개의 포인터를 소개합니다. 하나는 정수형 포인터이고 다른 하나는 부동 포인터입니다. 포인터는 별표 기호를 함께 사용하여 초기화됩니다.

# Int * pointInt;
# 플로트 *pointfloat;

이 두 프린터를 사용하여 메모리를 동적으로 할당합니다.



동적 할당에서 포인터의 역할:
저장 공간의 메모리는 블록 형태로 개발됩니다. 프로그램을 실행하거나 작업을 수행할 때마다 특정 목적을 위해 메모리가 할당됩니다. 해당 메모리에는 해당 메모리에 허용되는 프로세스 또는 프로그램을 식별하는 프로그램과 관련된 특수 주소가 있습니다. 모든 메모리 슬롯은 해당 슬롯이 속한 주소를 통해 액세스됩니다. 따라서 이 주소는 포인터를 통해 저장됩니다. 요컨대 메모리에 액세스하고 같은 방식으로 메모리의 특정 부분을 작업에 할당하려면 포인터가 필요합니다. 주소를 저장하려면 포인터가 필요합니다.

수동 할당에서 메모리의 동적 할당을 위해 'new' 키워드를 사용하므로 컴파일러에서 메모리를 할당합니다. 런타임에 메모리를 할당할 필요가 없습니다. 그러나 동적 할당은 무작위이므로 포인터를 식별하고 바인딩 프로세스를 위해 이 new 연산자가 사용됩니다.

# Pointint = 새로운 정수;

마찬가지로 부동 포인터도 마찬가지로 바인딩됩니다. 바인딩 프로세스 후에는 모든 작업에 대해 예약하려는 메모리에 값을 할당합니다. 포인터를 선언함으로써 메모리에 특정 값을 할당합니다.

# *pointInt = 50;

포인트 float에 대한 float 값도 선언됩니다. 할당 후 값을 표시합니다.

논의한 바와 같이 'new' 연산자는 메모리를 할당하는 데 사용되고 'delete'는 메모리 할당을 해제하는 데 사용됩니다. 따라서 코드에서 작업 또는 작업을 완료하면 작업에 할당한 메모리를 제거합니다.

다른 프로세스가 이를 사용할 수 있도록 메모리의 해당 부분을 할당 해제하는 것이 좋습니다. 이 할당을 두 포인터 모두에 적용합니다.

포인트 삭제 뜨다 ;

코드를 텍스트 편집기에 저장하면 Ubuntu 터미널에서 g++ 컴파일러를 통해 파일 내부의 소스 코드를 실행할 수 있습니다.

$ g++ -o mem mem.c
$ ./메모리

실행하면 메모리에 할당된 값이 표시됩니다.

예 2

이 예제에는 사용자 상호 작용이 포함됩니다. 사용자의 값을 포함할 숫자 변수를 사용합니다. 이 프로그램은 결과를 학생들의 GPA에 저장합니다. 모든 결과는 런타임에 저장됩니다.

사용자가 학생 수를 입력하면 각 수에 대해 메모리가 할당됩니다. 결과의 메모리 할당에 사용될 float 유형 포인터가 여기에서 초기화됩니다.

GPA는 십진수 표기법이므로 float 포인터를 사용합니다. GPA에 대한 포인터 유형 배열은 많은 학생에게 발생할 수 있기 때문에 사용합니다.

Ptr = 새로운 뜨다 [ 하나에 ]

'new' 키워드가 있는 이 포인터 배열은 실행을 메모리와 바인딩합니다. GPA는 각 학생에 대해 입력됩니다. 사용자가 추가하려는 학생 수에 익숙하지 않기 때문에 for 루프를 사용하여 입력한 숫자까지 GPA를 입력했습니다. 루프가 반복될 때마다 사용자는 학생을 식별하는 결과를 입력하라는 요청을 받습니다. 결과가 저장되면 루프를 다시 사용하여 학생의 모든 GPA를 표시합니다. 결국 포인터형 배열은 동적저장의 목적이 달성되어 삭제된다.

삭제 [ ] ptr ;

이제 위에서 언급한 코드를 실행할 것입니다. 사용자는 먼저 학생 수를 입력해야 합니다. 그런 다음 각 학생의 GPA가 입력됩니다.

예 3

이 예제에서는 클래스의 개체에 대해 new 및 delete 연산자를 사용합니다. 이 클래스에는 나이를 저장하는 정수 유형의 개인 변수가 포함되어 있습니다. 클래스의 공개 부분에서 연령을 숫자 '10'으로 초기화하는 생성자가 생성됩니다. 여기에서는 생성자에서 초기화되는 나이를 표시하는 또 다른 함수가 사용됩니다.

이제 동적 할당을 위한 기본 프로그램으로 이동합니다. 클래스의 객체는 동적으로 생성됩니다.

학생 * ptr = 새로운 학생 ( ) ;

객체가 형성되면 생성자가 자동으로 구현됩니다. 나이를 얻기 위해 함수 호출이 이루어집니다. 이것은 ptr을 통해 수행됩니다.

Ptr - > getAge ( ) ;

그리고 마지막에는 메모리가 해제됩니다.

결론

동적 메모리 할당은 컴파일러에 의해 식별되는 고정 저장소 대신 프로그래머에 의해 런타임 실행 시 할당됩니다. 이 할당은 무작위로 이루어지며 사용 후 제거될 수 있습니다. 반면 대부분의 경우 제거하기 전에 실행 프로세스가 중지되고 이 동적 할당으로 인해 메모리 누수가 발생합니다. 우리는 C++ 프로그래밍 언어를 사용하여 Ubuntu Linux 시스템에서 다양한 접근 방식으로 이 현상을 구현했습니다.