1) 메모리 사용에 대한 효율적 측면
✅ 특정 소스파일 실행 시 해당 코드들은 RAM에 올라가서 실행됨 하지만 RAM의 메모리 자원은 한정적.
✅ 따라서 특정 프로세스를 실행시킬 때 해당 프로세스가 처음부터 끝까지 계속 홀딩하고 있다면 그만큼 메모리 낭비가 발생.
✅ 사용할 때 에만 잠시 잡아 두었다가 필요 없으면 해당 메모리 해지시켜 다른 곳에서도 활용 즉 메모리 활용도를 높이는 것이 목적
2) 저장되는 메모리 공간 위치에 관한 문제
✅ 일반 변수나 함수는 기본적으로 stack 이라는 메모리 공간에 저장되는데 이곳에 저장되는 애들은 해당 범위를 벗어나면 파고되어 사용이 불가해짐.
✅ 하지만 동적할당 으로 잡은 메모리는 stack에 저장되지 않기 때문에 영향을 받지 않음
✅ 따라서 함수 리턴 이후에도 메모리 할당을 살아숨쉬게 하고 싶다면 '동적 할당' 사용
✅ If you need to allocate a large block of memory (e.g a large array or a big struct) , and you need to keep that variable around a long time (like a global), then you should allocate it on the heap
3) 능동적인 메모리 할당에 관한 문제
✅ 특정 배열을 저장해야 할 때 크기를 처음에는 100으로 잡았지만 추후 들어오는 크기가 1바이트에 불과하다면 공간 낭비 발생
✅ 하지만 동적할당은 그때 그때 필요한 공간마큼 메모리 요청이 가능해짐
1) 코드 영역 : 실행할 프로그램의 코드
2) 데이터 영역 : 전역변수, 정적변수(static)
3) 힙 영역 : 사용자의 동적 할당 ( 런 타임에 크기가 결정)
4) 스택 영역 : 지역변수, 매개변수 ( 컴파일 타임에 크기가 결정됨 )
✅ 위에 언급했듯이 지역변수와 매개변수 데이터들은 stack 공간에 생성되어, 스코프가 끝나는 지점에서 메모리 파괴됨.
✅ 하지만 동적할당은 stack이 아닌 heap 영역에 저장되기 떄문에 스택의 특징에 구속되지 않음.
✅ heap 메모리는 유저가 직접 관리 따라서 내가 할당하고 직접 해제 하기 전까지는 공간을 유지 하고 있음.
✅ 우향의 의미 : heap에 너가 요청하는 크기의 메모리 공간을 내가 확보한 뒤 시작 주소를 알려줄게 !
✅ 좌향의 의미 : 주소를 저장할 수 있게 포인터 변수 선언 할게 !
✅ 연산자(=) : 우향에서 받은 메모리 위치를 좌향의 변수에 대입 할게 !
✅ 포인터 변수는 stack에 생성
✅ new 로 리턴받은 메모리 주소 값은 heap에 생성