C++ 4.동적 메모리 할당
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; //반환
이렇게 동적 메모리 할당, 객체 동적 메모리 할당, 객체배열메모리할당을 알아보았다