프로그램이 정확하게 실행되기 위해서는 컴파일 시에 모든 변수의 주소값이 확정되어야만 함
=> 하지만 이를 위해서는 프로그램에 많은 제약이 따르기 때문에 프로그램 실행 시에 자유롭게 할당하고 해제할 수 있는 힙(heap) 이라는 공간이 따로 생겼음
이전에 컴파일러에 의해 어느정도 안정성이 보장되는 스택(Stack)과는 다르게 힙은 사용자가 스스로 제어해야 하는 부분인 만큼 책임이 따른다
c언어에서는 malloc과 free함수를 지원하여 힙 상에서의 메모리를 할당을 지원했음
C++에서도 마찬가지로 malloc과 free함수를 사용할 수 있다
-> 하지만 언어 차원에서 지원하는 것으로 바로 new와 delete라고 할 수 있다.
new는 말 그래도 malloc에 대응되는 것으로 메모리를 할당하고 delete는 free에 대응하여 메모리를 해제한다
// new와 delete의 사용
#include <iostream>
int main(){
int* p = new int;
*p = 10;
std::cout << *p << std::endl;
delete p;
return 0;
=> 10
int p = new int;
-> 위와 같이 int 크기의 공간을 할당하여 그 주소값을 p에 집어 넣었음을 알 수 있다. new 사용방법은
T pointer = new T;
지역변수를 delete하면??
/* 지역 변수 delete 하기 */
#include <iostream>
int main() {
int a = 5;
delete &a;
return 0;
}
heap이 아닌 공간을 해제한다고 하는 경고 메세지가 뜸
new로 배열 할당하기
/* new 로 배열 할당하기 */
#include <iostream>
int main() {
int arr_size;
std::cout << "array size : ";
std::cin >> arr_size;
int *list = new int[arr_size];
for (int i = 0; i < arr_size; i++) {
std::cin >> list[i];
}
for (int i = 0; i < arr_size; i++) {
std::cout << i << "th element of list : " << list[i] << std::endl;
}
delete[] list;
return 0;
}
list에 new를 이용하여 크기가 arr_size인 int 배열 생성
배열 생성할 때 []사용하여 배열의 크기를 넣어주면 됨
=> new가 주소를 반환하기 때문에 포인터형 배열 int *를 사용해야함