본문 바로가기
c++

11. [C++] 동적 메모리 할당과 해제, 변수 동적 할당, 동적 배열 / 2차원 배열 동적 할당

by yoonjunho 2023. 1. 15.

포인터는 앞에서 설명한 것과 같이 메인 메모리 상의 주소의 위치를 가리키고 있다.

포인터를 이용하여 프로그램이 실행되는 동안 이름이 없는 메모리를 할당할 수 있다.

c언어에선느 malloc()과 같은 함수를 이용하여 메모리를 할당할 수 잇따.

c++에서도 malloc()함수를 사용할 수 있지만 여기서는 new연산자를 사용해보자.

 

typeName *pointerName = new typeName;

 

할당할 메모리의 종류를 지정하여 new 연산자를 사용하여 new 연산자는 알맞은 크기의 메모리 공간을 확보한 후 해당 공간의 메모리 주소를 반환한다.

이 주소를 포인터 변수에 대입하여 새롭게 확보한 메모리 공간을 사용할 수 있다.

 

예를 들어 int형 데이터를 저장할 메모리 공간을 할당받아 사용하기 위해 다음과 같이 한다. 

int *p_var = new int;

new연산자는 int형에 맞는 메모리 공간을 할당한 후 해당 주소를 리턴한다.

이 주소가 포인터 변수인 p_var에 저장되고 이후 p_var를 통해 해당 주소에 접근할 수 있다. 

 

new를 통해 할당한 메모리는 사용후 delete연산자를 사용하여 반환한다. 위에서 할당한 메모리는 다음과 같이 해제한다. 

delete p_var

메모리를 할당 해제 하지 않을 경우 메모리 누수가 발생하여 프로그래밍 제대로 동작하지 않을 수 있다.

*메모리 누수 : https://www.ibm.com/docs/ko/aix/7.1?topic=performance-memory-leaking-programs 

 

new연산자를 사용하여 동적 배열을 생성할 수 있다. 

int *p_arr = new int[10];   <- 1차원 배열 동적 할당

new연산자는 동적 배열의 메모리를 할당하고 해당 배열의 시작 주소를 반환한다. 

동적 배열을 해제하는 방법은 다음과 같다.

delete [ ] p_arr;

 

이제 동적 메모리와 동적 배열을 생성하여 사용하는 예제를 실행시켜 보고 메모리 공간에 접근하는 방법을 연습해보자.

포인터 변수에 1을 더하면 포인터가 지시하는 데이터형의 바이트 수만큼 값이 증가한다.

 

실습 예제 2-13 : 

#include <iostream>

int main(void) {
	using namespace std;
	int* p_var = new int;
	double* p_arr = new double[3];

	*p_var = 1001;//동적할당을 한 변수에 정수를 집어넣는다.
	p_arr[0] = 20000.644456465;//동적 할당을 한 배열에 실수를 집어넣는다.
	p_arr[1] = 0.5546;//동적 할당을 한 배열에 실수를 집어넣는다.
	p_arr[2] = 10000001.0000000;//동적 할당을 한 배열에 실수를 집어넣는다.

	cout << "값: " << *p_var << endl;//동적할당을 한 실수 변수의 값을 출력한다.
	cout << "주소: " << p_var << endl;//동적할당은 포인터 변수를 이용하므로(포인터변수에 할당한 메모리 주소를 집어넣는다. 포인터 변수이름은 있지만, 변수의 이름은 없다.)
	cout << "사이즈?: " << sizeof(p_var) << endl;//동적 할당을 한 배열의 주솟값이 담긴 포인터 변수의 크기를(바이트 수)를 출력한다.
	cout << "사이즈?: " << sizeof(*p_var) << endl;//뭘까이게
	cout << "\n";
	for (int i=0;i<3;i++)
		cout << "p_arr["<<i <<"] : " << p_arr[i] << endl;
	cout << "\n오리지널\n";
	cout << "p_arr= " << p_arr << ", *p_arr = " << *p_arr << endl;
	cout << "\np_arr+1을 하고 난 후\n";
	p_arr = p_arr + 1;
	cout << "p_arr= " << p_arr << ", *p_arr = " << *p_arr << endl;
	cout << "p_arr[0] = " << p_arr[0] << ", p_arr[1] = " << p_arr[1] << endl;
	cout << "*p_arr=" << *p_arr << ", *(p_arr+1) = " << *(p_arr + 1) << endl;

	cout << "\np_arr-1을 하고 난 후\n";
	p_arr = p_arr - 1;
	cout << "p_arr= " << p_arr << ", *p_arr = " << *p_arr << endl;
	cout << "p_arr[0] = " << p_arr[0] << ", p_arr[1] = " << p_arr[1] << endl;
	cout << "*p_arr = " << *p_arr << ", *(p_arr+1) = " << *(p_arr + 1) << endl;

	delete p_var;
	delete [] p_arr;
	return 0;
}

ㄴ실수의 표준출력 : https://yoonjunho.tistory.com/140

 

 

2차원 배열 동적 할당 

int **arr =new int*[ROW];       

for(int i=0; i<ROW;i++){

    arr[i]=new int[COL];

}

 

**C++ 변수로 크기 받아서 2차원 배열 선언

->그냥 INT N으로 한다음에 arr[n][n]해도 되는데, 그러면 내 컴에서는 되는데, 백준에서는 컴파일 에러가 난다. 

const int n으로 한 다음에 arr[n][n]이렇게 해야한다.

 

책 : 이게 진짜 c++프로그램이다 61p.

'c++' 카테고리의 다른 글

20. [C++] 객체 배열  (0) 2023.01.20
19. [C++] 생성자와 소멸자  (0) 2023.01.20
1-3 [C++] 실수 표준출력  (0) 2023.01.15
10. [C++] 포인터와 배열  (0) 2023.01.15
9. [C++] 포인터  (0) 2023.01.15