title: “C++ 4.동적 메모리 할당” categories:

  • CspecialCharspecialChar

    #C++ 4.동적 메모리 할당 : 네이버 블로그

보통 프로그램 실행 중 메모리를 할당해 변수, 객체, 배열을 정적으로 선언한다.

그러나 프로그램 실행 도중 메모리에 할당해야할 일이 생기면 어떻게 할까

C에서는 malloc()와 free()명령어로 동적 메모리 할당/반환이 가능했다

C++에서는 new와 delete 연산자를 사용 할 것이다

일단 new 연산자는

데이터타입 *포인터변수 = new 데이터타입; 으로 이루어진다

예시로

int *p =new int;와 같은 형식이다

즉 포인터 변수 p에 int 타입 정수의 공간이 할당 된 것이다

같은 식으로

char *a = new char;

같이 포인터 a에 char 타입의 문자 공간을 할당 할 수 있다

delete는 간단하다

delete 포인트 변수를 해주면 된다

delete p;

delete a; 처럼 포인터 변수의 이름만 쓰면 자동으로 반환된다

예제를 보자

#include "pch.h"
#include 
using namespace std;
int main(){
 int \*p;
 p = new int;
 \*p = 5;
 cout << \*p << endl;
}

main 안의 한 줄 씩 가보겠다

int *p; //포인터 변수 p 선언

p= new int; //int 타입을 포인터 변수 p에 할당

*p=5; //할당받은 int 타입 공간에 5대입

cout « *p «endl; //p에 저장된 값 출력

이 코드는 동적 할당의 기본 형식이다.

이것만 보면 동적 할당의 쓰임새에 대해 알기 어려울 수 있다

아래 코드를 보자

#include "pch.h"
#include 
using namespace std;
int main() {
 int n;
 cout << "몇개의 정수를 입력합니까" << endl;
 cin >> n;
 int \*p = new int[n];

 for (int i = 0; i < n; i++)
 {
 cout << i << "번째 정수 입력" << endl;
 cin >> p[i];
 }
 int sum = 0;
 for (int i = 0; i < n; i++)
 {
 sum = sum + p[i];
 }
 cout << "총합은" << sum << "입니다" << endl;
delete [] p;
}

처음 나오는 동적선언 부분만 설명하겠다

int main() {

int n;

cout « “몇개의 정수를 입력합니까” « endl;

cin » n; //n 을 입력받고

int *p = new int[n]; .//n개만큼 int형 공간을 할당

for (int i = 0; i < n; i++)

{

cout « i « “번째 정수 입력” « endl;

cin » p[i]; //p에 5개의 정수 입력받음

}

int sum = 0;

for (int i = 0; i < n; i++)

{

sum = sum + p[i];

}

cout « “총합은” « sum « “입니다” « endl;

delete [] p; //할당받은 p 반환

}

위와 같이 int *p = new int[n];을 통해 프로그램 실행 중 n만큼의 int형 메모리를 할당받을 수 있다

이런 동적 메모리 할당을 객체(클래스)에도 사용할 수 있다

클래스이름 *포인터변수 = new 클래스이름

클래스이름 *포인터변수 = new 클래스이름(생성자매개변수)

와 같은 형식이다

반환은 똑같이 delete 포인트변수로 하면 된다

아래 코드는 전 포스팅의 circle 클래스에 main 내에서 동적 할당을 하는 코드이다

#include "pch.h"
#include 
using namespace std;
class circle {
public:
 int radius;
 circle();
 circle(int r);
 double getarea();
};
circle::circle() {
 radius = 1;
}
circle::circle(int r) {
 radius = r;
}
double circle::getarea() {
 return radius \* radius\*3.14;
}
int main() {
 circle \*p, \*q;
 p = new circle;
 q = new circle(10);
 cout << p->getarea() << endl;
 cout << q->getarea() << endl;
 delete p, q;
}

main 안의 코드만 설명하겠다

circle *p, *q; //포인터변수 p,q선언

p = new circle; //p에 circle 클래스 동적 할당

q = new circle(10); //q에 circle 클래스 동적 할당, 매개변수 10

cout « p->getarea() « endl; //포인터변수 p의 맴버 getarea에 접근 실행

cout « q->getarea() « endl; //포인터변수 p의 맴버 getarea에 접근 실행

delete p, q;

#include "pch.h"
#include 
using namespace std;
class circle {
public:
 int radius;
 circle();
 circle(int r);
 double getarea();
};
circle::circle() {
 radius = 1;
}
circle::circle(int r) {
 radius = r;
}
double circle::getarea() {
 return radius \* radius\*3.14;
}
int main() {
 int radius;
 while (1)
 {
 cout << "반지름을 입력하세요(음수이면 종료)" << endl;
 cin >> radius;
 if (radius<0)
 {
 break;
 }
 circle \*p = new circle(radius);
 cout << "원의 면적은" << p->getarea() << endl;
delete p;
 }
}

main 내의 코드만 설명하겠다

int radius; //radius 변수 선언

while (1)

{

cout « “반지름을 입력하세요(음수이면 종료)” « endl;

cin » radius; //radius 입력받음

if (radius<0) //음수이면 종료

{

break;

}

circle *p = new circle(radius); //circle 클래스 포인터 p 선언 후 new circle(radius)로 동적 생성

cout « “원의 면적은” « p->getarea() « endl;

delete p;

위의 코드에서 동젹 변환은 꼭 필요하지는 않지만 같은 정적 객체에서 값을 변환시키는 것보다 동적 할당으로 계속 다른 p를 할당하는 것이 중요하다

다음은 객체 배열을 동적으로 할당해보자

#include "pch.h"
#include 
using namespace std;
class circle {
public:
 int radius;
 circle();
 circle(int r);
 double getarea();
};
circle::circle() {
 radius = 1;
}
circle::circle(int r) {
 radius = r;
}
double circle::getarea() {
 return radius \* radius\*3.14;
}
int main() {
 int n;
 cout << "몇개의 원을 생성합니까?" << endl;
 cin >> n;
 circle \*p = new circle[n];
 for (int i = 0; i < n; i++)
 {
 cout << i << "번째 반지름 입력" << endl;
 cin >> p[i].radius;
 }

 for (int i = 0; i < n; i++)
 {
 cout << p[i].getarea() << endl;
 }
 delete[] p;
}

main 내의 함수만 설명하겠다

int n;

cout « “몇개의 원을 생성합니까?” « endl;

cin » n; //n 입력받기

circle *p = new circle[n]; //n개만큼 circle 동적 생성

for (int i = 0; i < n; i++)

{

cout « i « “번째 반지름 입력” « endl;

cin » p[i].radius; //p[i]주소의 radius 에 접근

}

for (int i = 0; i < n; i++)

{

cout « p[i].getarea() « endl; //p[i]의 getarea에 접근

}

delete[] p; //반환

이렇게 동적 메모리 할당, 객체 동적 메모리 할당, 객체배열메모리할당을 알아보았다

업데이트: