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 언어
C++ 상속 이 튜토리얼에서는 예제를 통해 C++의 상속에 대해 배웁니다. 상속은 C++에서 객체 지향 프로그래밍의 핵심 기능 중 하나입니다. 기존 클래스(기본 클래스)에서 새 클래스(파생 클래스)를 만들 수 있습니다. 파생 클래스는 기본 클래스의 기능을 상속합니다. 고유한 추가 기능을 가질 수 있습니다. 예를 들어, class Animal { // eat() function // sleep() function }; class Dog : public Animal { // bark() function };
C 동적 메모리 할당을 배우기 전에 다음을 이해합시다. C에서 메모리 관리는 어떻게 작동합니까? 기본 데이터 유형을 사용하여 변수를 선언하면 C 컴파일러는 스택이라는 메모리 풀에서 변수에 대한 메모리 공간을 자동으로 할당합니다. . 예를 들어, float 변수는 선언될 때 일반적으로 플랫폼에 따라 4바이트를 사용합니다. sizeof 를 사용하여 이 정보를 확인할 수 있습니다. 아래 예와 같은 연산자 #include <stdio.h> int main() { float x; printf(The size of float i