C++기초
220322 - 동적 할당(Dynamic Allocation)
hyrule
2022. 3. 25. 16:45
#include <iostream>
#include <crtdbg.h> //crt debug라는 헤더. 메모리 릭이 발생했는지 확인해주는 헤더
int main()
{
//아래 코드를 이용해서 메모리 릭을 체크할 수 있다.
/*단, Ctrl + F5를 이용해서 실행을 하면 릭이 체크가 안된다.
릭을 체크하고자 한다면 F5(디버그 모드 실행)을 이용해서
실행하면 릭이 있을 경우 출력창에 릭을 알려준다.*/
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
/*
동적할당 : 메모리를 시작할 때 만들어주는 것이 아닌 필요한 순간에 공간을 만들어주는 기능이다.
메모리를 내가 원할때 쓰고 제거하는 것이 가능. 효율적으로 쓸 수 있다.
new와 delete 키워드를 이용해서 동적으로 메모리를 할당하고 동적으로 할당된 메모리를 제거할 수 있다.
단, 동적할당된 메모리는 delete를 통해서 제거를 안 할 경우 메모리공간을 그대로 계속 차지하고 있게 된다.
이 상태에서 프로그램이 종료되면 메모리가 할당된 채로 남아있는 현상이 생기는데 이를 메모리 릭 이라고 한다.
일반적인 할당 때는 프로그램을 종료할 때 알아서 지워지지만 동적 할당은 그렇지 않다.
이를 개선한 것이 C#과 JAVA. 동적할당을 자동으로 해제해주는 가비지 컬렉터가 존재하기 떄문에 자동으로 할당을 해제한다. 대신 느림.
new 변수타입; 을 해주면 변수타입의 메모리 크기만큼을 동적으로 할당해주고 생성된 메모리의 '주소'를 반환한다. -> 포인터변수에 저장 가능
반환된 주소는 반드시 따로 저장을 해 주어야 한다.(포인터랑 항상 세트로 써야함)
메모리를 제거할 떄 해당 주소를 알아야 제거가 가능하기 떄문이다.
*/
int* Number = new int;
//포인터 변수는 단순히 동적할당을 한 공간의 메모리 주소를 담고 있을 뿐이다.
int Number1 = 100;
int* Number2 = &Number1;
//메모리 주소를 알아야 제거가 가능하다.
delete Number;
//int타입 100개만큼을 만들고 그 시작점을 포인터 변수에 담는다.
int* Array = new int[100];
Array[1] = 300;
delete[] Array;
return 0;
}