C
int* pnData = (int*)malloc(sizeof(int));
free(pnData);
malloc 함수는 크기
를 받아서 메모리 공간을 확보하고 해당 공간의 주소를 반환
하는 함수인데,이 메모리 공간의 용도
는 전혀 고려하지 않기 떄문에 사용자가 알아서 잘 사용해야 한다.
포인터의 자료형은 대상의 자료형을 해석하는데 사용되어 예를들어 int*의 경우 가르키는 대상을 int로 해석해버린다. 이런 자유도는 실력이 좋은 개발자들은 잘 활용할수 있지만, 초보자에게는 안전장치가 없으므로 위험할 수 있다.
Cpp
malloc 함수같은 경우 메모리가 제한적이던 시절 설계된 함수였는데 실패할 경우 null을 반환해서 예외처리를 해주어야 했다.
메모리의 용량이 커지고 메모리 할당이 실패할 가능성이 굉장히 낮아졌기 떄문에 동적할당과 해제를 new,delete 연산자를 사용한다.
int* pnNewData = new int;
delete pnNewData;
int* pnNewData = new int[5];
delete[] pnNewData;
new 자료형의 형태로 사용되고, 자료형은 크기개념을 이미 가지고있기때문에 개발자가 따로 크기를 지정할 필요가 없어 직관성이 더좋다.
자료형의 자리에 class가 오게되면 해당 class 생성자를 호출한다.
delete의 경우 해당 class의 소멸자를 호출한다.
참조자
포인터는 변수이기 떄문에 포인터가 가르키는 대상이 계속 바뀔수 있고 이에 관한 문제가 생길수 있다.
이런 상황에서 참조자를 사용할 수 있다. 참조자는 포인터와 같이 주소를 저장하지만, 선언할때 가르킨 대상이 절대로 변하지 않는다.
즉, int& pnData(a)는 int* const pnData = &a와 같다.
int nData(10);
int& rData(nData);
rData = 5;
std::cout << nData << std::endl; // 5 출력