산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 동적 메모리

C++에서 동적 메모리가 실제로 어떻게 작동하는지 잘 이해하는 것은 훌륭한 C++ 프로그래머가 되는 데 필수적입니다. C++ 프로그램의 메모리는 두 부분으로 나뉩니다 -

정의된 변수에 특정 정보를 저장하는 데 필요한 메모리의 양과 런타임에 필요한 메모리의 크기를 결정할 수 있는 메모리의 양을 미리 알지 못하는 경우가 많습니다.

할당된 공간의 주소를 반환하는 C++의 특수 연산자를 사용하여 주어진 유형의 변수에 대한 힙 내에서 런타임에 메모리를 할당할 수 있습니다. 이 연산자를 new라고 합니다. 연산자.

동적으로 할당된 메모리가 더 이상 필요하지 않으면 delete를 사용할 수 있습니다. new operator에 의해 이전에 할당된 메모리를 할당 해제하는 operator.

새 연산자 및 삭제 연산자

new를 사용하기 위한 일반 구문은 다음과 같습니다. 모든 데이터 유형에 대해 동적으로 메모리를 할당하는 연산자입니다.

new data-type;

여기서 데이터 유형 배열을 포함한 모든 내장 데이터 유형이거나 클래스 또는 구조를 포함하는 사용자 정의 데이터 유형일 수 있습니다. 내장 데이터 유형부터 시작하겠습니다. 예를 들어 double 유형에 대한 포인터를 정의한 다음 실행 시간에 메모리를 할당하도록 요청할 수 있습니다. 를 사용하여 이 작업을 수행할 수 있습니다. 다음 문장이 있는 연산자 -

double* pvalue  = NULL; // Pointer initialized with null
pvalue  = new double;   // Request memory for the variable

여유 저장소가 모두 사용된 경우 메모리가 성공적으로 할당되지 않았을 수 있습니다. 따라서 new 연산자가 NULL 포인터를 반환하는지 확인하고 아래와 같이 적절한 조치를 취하는 것이 좋습니다. -

double* pvalue  = NULL;
if( !(pvalue  = new double )) {
   cout << "Error: out of memory." <<endl;
   exit(1);
}

malloc() C의 함수는 여전히 C++에 존재하지만 malloc() 함수를 사용하지 않는 것이 좋습니다. malloc()에 비해 new의 주요 이점은 new가 메모리를 할당할 뿐만 아니라 C++의 주요 목적인 객체를 구성한다는 것입니다.

언제든지 동적으로 할당된 변수가 더 이상 필요하지 않다고 생각되면 다음과 같이 'delete' 연산자를 사용하여 자유 저장소에서 차지하는 메모리를 해제할 수 있습니다. -

delete pvalue;        // Release memory pointed to by pvalue

위의 개념을 넣고 'new'와 'delete'가 어떻게 작동하는지 보여주기 위해 다음 예를 만들어 보겠습니다. −

라이브 데모
#include <iostream>
using namespace std;

int main () {
   double* pvalue  = NULL; // Pointer initialized with null
   pvalue  = new double;   // Request memory for the variable
 
   *pvalue = 29494.99;     // Store value at allocated address
   cout << "Value of pvalue : " << *pvalue << endl;

   delete pvalue;         // free up the memory.

   return 0;
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -

Value of pvalue : 29495

배열을 위한 동적 메모리 할당

문자 배열, 즉 20자 문자열에 대한 메모리를 할당한다고 가정합니다. 위에서 사용한 것과 동일한 구문을 사용하여 아래와 같이 메모리를 동적으로 할당할 수 있습니다.

char* pvalue  = NULL;         // Pointer initialized with null
pvalue  = new char[20];       // Request memory for the variable

방금 생성한 배열을 제거하려면 다음과 같이 하십시오. -

delete [] pvalue;             // Delete array pointed to by pvalue

new 연산자의 유사한 일반 구문에 따라 다음과 같이 다차원 배열에 할당할 수 있습니다. -

double** pvalue  = NULL;      // Pointer initialized with null 
pvalue  = new double [3][4];  // Allocate memory for a 3x4 array 

그러나 다차원 배열의 메모리를 해제하는 구문은 위와 동일하게 유지됩니다. -

delete [] pvalue;            // Delete array pointed to by pvalue

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

객체는 단순 데이터 유형과 다르지 않습니다. 예를 들어, 개념을 명확히 하기 위해 객체 배열을 사용할 다음 코드를 고려하십시오.

라이브 데모
#include <iostream>
using namespace std;

class Box {
   public:
      Box() { 
         cout << "Constructor called!" <<endl; 
      }
      ~Box() { 
         cout << "Destructor called!" <<endl; 
      }
};
int main() {
   Box* myBoxArray = new Box[4];
   delete [] myBoxArray; // Delete array

   return 0;
}

4개의 Box 객체로 구성된 배열을 할당한다면 Simple 생성자가 4번 호출되고 이와 유사하게 이러한 객체를 삭제하는 동안 소멸자도 같은 횟수로 호출됩니다.

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -

Constructor called!
Constructor called!
Constructor called!
Constructor called!
Destructor called!
Destructor called!
Destructor called!
Destructor called!

C 언어

  1. C++ 데이터 유형
  2. C++ 연산자
  3. C++ 주석
  4. C - 메모리 관리
  5. C++ 개요
  6. C++ 상수/리터럴
  7. C++의 연산자
  8. C++의 숫자
  9. C++ 참조
  10. C++ 동적 메모리