동적메모리할당이란?
int a = 10;
...
/* 프로그램 작동중 */
...
{
int b = 20;
}
...
/* 프로그램 작동중 */
...
만약 이렇게 코드를 작성한다고한다면 변수 a와 b는 컴퓨터 메모리의 어느한곳을 할당 받게 된다.
블록안에 있거나 함수안에 있는 지역변수들은 해당 블록이 끝나면 사라지게되며, 전역변수는 프로그램이 시작되고 생성이 되며 프로그램이 종료될때 소멸된다.
하지만 필요에 따라서는 메모리에 할당한후 그 기억공간이 필요없다면 미리없어져도 될수있어야한다.
필요에따라서 메모리에 할당도 할수있어야하며 필요에따라서 반환도 해야한다
이것을 동적 메모리할당 ( Dynamic memory allocation)이라고 한다.
그런데 동적 메모리할당으로 생선된 저장공간은 변수처럼 이름이없다. 그래서 이름을통해 액세스 할수없다.
동적으로 할당한곳을 포인터변수가 가리키게 하면 그 포인터를 이용해서 액세스 할수있다.
new : 동적으로 메모리를 할당하는 연산자
1. ptrVar = new TypeName;
2. ptrVar = new TypeName[n];
1번 형식은 지정된 자료형의 데이터 1개를 저장할수있는 공간을 할당하며,
2번 형식은 지정된 자료형의 데이터 n개를 저장할수있는 배열을 할당한다.
❗이때 지정된 자료형은 포인터의 자료형과 일치해야한다.
delete : 동적으로 메모리를 반납하는 연산자
1. delete ptrVar;
2. delete [] ptrVar;
1번형식은 데이터1개를 반환하며
2번형식은 데이터n개가 할당된 배열을 반환한다
❗new로 만든 형식 그대로 delete해주면된다.
//동적으로 할당하는방법
int *intPtr;
intPtr = new int;
...
//동적으로 반환하는방법
delete intPtr;
intPtr = nullptr;
delete연산자를 이용 해당 공간을 시스템에 반환하여도 intPtr포인터는 여전히 그공간을 가리키고있다.
반드시 intPtr = nullptr; 이라는 명령어로 가리키고있는 곳이 없음을 명시해주어야 합니다.
추가설명
delete 연산자는 동적으로 할당된 메모리를 메모리 풀로 반환합니다. 그러나 delete는 포인터 변수 자체를 수정하거나 변경하지 않습니다. 즉, delete는 메모리를 해제하지만 포인터 변수가 그 메모리를 가리키는 것을 그대로 둡니다. 이를 '댕글링 포인터(dangling pointer)'라고 합니다.
댕글링 포인터는 실제적으로 메모리를 가리키고 있지만, 그 메모리는 이미 해제되어 프로그램에서 사용할 수 없는 상태입니다. 댕글링 포인터를 통해 메모리에 접근하려고 하면 예측할 수 없는 결과를 초래할 수 있습니다. 이는 메모리 누수와 함께 동적 메모리 관리에서 가장 주의해야 할 문제 중 하나입니다.
따라서 메모리를 해제한 후에는 포인터를 nullptr로 설정하여 댕글링 포인터를 방지하는 것이 좋습니다. nullptr는 포인터가 어떤 메모리도 가리키고 있지 않음을 나타내는 특별한 값입니다. 이렇게 하면 포인터가 더 이상 유효하지 않은 메모리를 가리키지 않도록 할 수 있습니다.
'컴퓨터 과학 > C++' 카테고리의 다른 글
c++ 함수의 선언과 정의 (0) | 2025.01.10 |
---|---|
lvalue , rvalue 차이점 정확하게 이해하자 (0) | 2023.12.04 |
C++ const 한정어란? 위치에따른 다른결과값정리 요약 (2) | 2023.12.03 |
C++ , 연산자 다중정의 하는방법 연산자 다중정의란? (1) | 2023.12.02 |
3.4 inline 함수 (0) | 2023.12.01 |