-
C++ 포인터와 메모리 해제 (2)C++ 2025. 3. 18. 18:01
new 연산자
어떤 데이터형을 원하는지 new 연산자에게 알려주면, new 연산자는 그에 알맞은 크기의 메모리 블록을 찾아내고 그 블록의 주소를 리턴한다.
int* pointer = new int;
new int를 하게되면 int형 데이터를 저장할 수 있는 새로운 메모리가 필요하다는 것을 의미한다.
pointer는 새로운 데이터 객체를 가리키고있다.
delete 연산자
사용한 메모리를 다시 메모리 폴로 환수하며 환수된 메모리는 프로그램의 다른 부분이 다시 사용한다.
int* ps = new int; // 메모리 사용 delete ps;
new를 사용했으면 delete를 해서 동적으로 할당된 메모리공간을 해제하자.
그렇지 않으면 나중에 메모리 누수가 발생할 수 있다.
1. new로 대입하지 않은 메모리는 delete로 해제할 수 없다.
2. 같은 메모리 블록을 연달아 두 번 delete로 해제할 수 없다.
3. new[]로 메모리를 대입할 경우 delete[]로 해제한다.
4. 대괄호를 사용하지 않았다면 delete도 대괄호를 사용하지 않아야 한다.
#include <iostream> #include <cstring> using namespace std; int main() { double* p3 = new double[3]; // double형 데이터 3개를 저장할 수 있는 공간을 대입한다. p3[0] = 0.2; p3[1] = 0.5; p3[2] = 0.8; cout << "p3[1] is " << p3[1] << endl; p3 = p3 + 1; cout << "Now p3[0] is " << p3[0] << endl; cout << "p3[1] is " << p3[1] << ".\n"; p3 = p3 -1; delete[] p3; return 0; }
먼저 p3라는 포인터 배열 3칸을 동적으로 할당하였다. 이렇게 되면 제일 초기 p3는 p3[0]의 주소값을 가리키게 된다. 똑같이 *p3을 찍어보면 p3[0]의 주소값이 아닌 값을 가져온다.
따라서 p3 = p3 + 1을 하면, p3[0]이 아닌 p3[1]을 가리킨다.
마무리로 아까 할당했던 메모리공간을 해제 해주는것을 까먹지말자.
나는 아직 출력할때 간접참조 연산자를 붙이고 안붙이고의 차이점이 헷갈린다.
그러나 값을 변경하거나, 값의 결과를 출력할때는 *를 붙이고, 붙이지 않는다면 해당 값이 아닌 주소값을 가져오는 것으로 이해했다.
'C++' 카테고리의 다른 글
C++ 반복문 (1) (0) 2025.03.20 C++ 포인터 연산 (0) 2025.03.18 C++ 포인터와 메모리 해제 (1) (0) 2025.03.18 C++ 공용체와 열거체 (0) 2025.03.18 C++ 구조체 (0) 2025.03.18