Archive/Develop

[ C++ ] C++ 동적 메모리 할당 및 반환

코뮤(commu) 2021. 4. 6. 10:24
728x90
반응형

 

동적 메모리 할당

 

정적 할당

 

변수 선언을 통해 필요한 메모리 할당

 

동적 할당

 

필요한 양이 예측되지 않는 경우. 프로그램 작성시 할당 받을 수 없음

실행중에 힙 메모리에서 할당

-> 힙으로부터 할당 받는다.

 

 

 

C 언어의 동적 메모리 할당

 

 

할당 : malloc

 

해제 : free

 

위 두개 라이브러리 함수를 사용한다.

 

 

C++의 동적 메모리 할당/ 반환

 

new 연산자

 

기본타입 메모리 할당, 배열 할당, 객체 할당, 객체배열 할당

객체의 동적 생성 - 힙 메모리로부터 객체를 위한 메모리 할당 요청

객체할당시 생성자 호출

 

delete 연산자

 

new로 할당받은 메모리 반환

객체의 동적 소멸 - 소멸자 호출 뒤 객체를 힙에 반환한다.

 

 

 

 

 

+ 메모리

 

1. 코드영역 : 코드

2. 데이터 영역: 전역변수, static 변수( 프로그램 시작시 할당, 프로그램 종료시 소멸)

3. 힙(heap)영역 : 동적할당영역(new로 할당, delete 로 해제)

4. 스택(stack) 영역 : 매개변수, 지역변수(해당 함수 실행 시 할당, 함수 종료 시 해제)

 

 

 

 

변수와 클래스 배열 등은 stack 영역(정적할당, 컴파일시에 할당)

동적할당은 런(실행)시에 할당하고 직접 접근 불가.

 

그러므로 스택영역에 포인터 변수를 만들어 놓고 접근한다.

 

 

 

 

new 와 delete 연산자

 

C++ 의 기본 연산자이다.

 

new/delete 연산자 사용형식

 

 

new

데이터타입 *포인터변수 = new 데이터 타입;

 

delete

delete 포인터변수

 

 

new/delete의 사용

 

int *plnt = new int;

 

delete pInt;

 

 

 

 

 

C++ 메모리 할당 예제

 

#include <iostream>
#include <string>
using namespace std;



int main() {
	int* p;

	p = new int[5];
	int n;
	if (!p) {
		cout << "메모리 할당 불가";
		return 0;
	}

	for (int i = 0; i < 5; i++) {
		p[i] = i+1;
		n = p[i];
		cout << "*p = " << p[i] << '\n';
		cout << "n = " << n << '\n';
	}
	

	delete []p;
}

 

 

 

 

 

 

 

 

아래와 같이 활용할 수 있다.

 

 

 

int main() {
	cout << "입력할 정수 개수? : ";
	int n;
	cin >> n; // 정수 개수 입력
	if (n <= 0) return 0;
	int* p = new int[n];
	if (!p) {
		cout << "메모리 할당 불가";
		return 0;
	}

	for (int i = 0; i < n; i++) {
		cout << i + 1 << "번째 정수 : " ;
		cin >> p[i];
	}

	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum += p[i];
	}
	cout << "평균 : " << sum / n << endl;
	delete []p;
		
	
}

 

 

 

 

 

 

728x90
반응형