c++ 에서 보통 메모리 영역을 나눌때
변수는
지역변수
전역 정적 외부데이터 변수로 나누고
메모리 영역은
스택
데이터
ROM
힙 영역인데
작성된 변수들은 프로그램이 시작되는 순간 이미 자료형으로 다 byte 고정으로 정해지는 애들이다.
하지만 특수한경우 즉 프로그램을 시작 해야지만 알수있는 영역도 있다.
그런경우에 프로그램이 런타임 돌고 있는 도중에 대응이 가능한 영역도 필요하다.
그런게 보통 힙영역으로 잡아줘야하는데 이때 필요한게 malloc() 이다.
동작 자체는 힙영역에 매개 변수 로 들어온 값에 byte에 크기를 메모리에 할당하고 그 포인터 주소를 반환하는 명령어이다.
int* pInt = (int*)malloc(4); // 4byte 할당하고 시작 주소를 메인 스택에 있는 변수에게 넘겨준것
float* pF = (float*)malloc(4);
pInt를 보게 되면 힙영역에 메모리 값을 알수있다.
그래서 리턴값을 다양하게 받을수있다.
이때 리턴되는 타입이 void*인데 byte 크기 부터 받아서 처리하는 과정 까지 모든걸 사용자가 정할수 있기때문이다.
주의 해야하는건 역시 >> 포인터 를 사용한 할당 이고 주소값으로 처리 하기 때문에 관련해서 주의 해야한다.
float* pF = (float*)malloc(4);
int* pTestI = (int*)pF;
pF = 2.4f;
int i = *pTestI;
코드가 이렇게 진행 된다고하면 float 형도 4byte int형도 4byte 2.4f pF에 대입했고
정수로 가져오면 뭐 2로 나오겠지 라고 생각하면 큰일난다 예전에 포스팅 했을때 소수점 자체는 메모리에 기록하는 방식이 다르기 때문에
다른 10549539 << 이런 형태에 큰값이 갑자기 들어와있는다. 결국 사용자가 직접 자료형에 대한 부분은 캐치를 해주면 좋다.
이런 동적할당은 코드를 작성하는사람이 포인터를 사용해서 관리 하는것이다.
지금까지는 변수를 사용할때 다 그냥 선언만 했다.
사실 빌드 할때 어셈블리어로 변환 되어서 처리 하는데 이때 지역 변수 전역변수 등등 이런것들은 이미 선언 하는 부분이있다면 숨겨져있지만 그 변수가 메모리를 잡고있는부분 끝에 그 변수에 대한 메모리 해제 하는 부분도 역시 있다.
이런 변수들은 프로그램이 해주지만 동적할당은 이러한 부분은 책임을 지지 않는다
그래서 코드짜는 사람이 직접 관리를 해줘야한다.
int iInput = 0;
scanf_s("%d", &iInput);
int* pInt = nullptr;
if (100 == iInput) {
pInt = (int*)malloc(100);
}
if (pInt != nullptr) {
free(pInt);
}
위에 코드를 보면 intput 하는 값이 100 이여야지만 malloc(100)을 하는 부분이다.
이렇게 하면 코드에 부분에서 프로그램은 if 안에 부분이 동작 할지 안할지 모르고 얼만큼인지도 모르기 때문에 할당 해제를
자동으로 할수가 없다.
그래서 아래 if로 다시 비교를 해서 값이 있다면 해체 하는 함수 free()를 하는 것이다. 이때 값으로 해제하고 싶은 포인터 변수를
넣어주면 된다.
동적 할당을 하면 해제하는 부분 까지 직접 해줘야한다 만약 안해준다하면 메모리 누수 발생 + 쌓여가서 컴퓨터 멈춤 메모리 부족하는 현상도 예전에 많이 발생했엇다.