[C++] malloc,free VS new,delete + C++의 참조자
malloc과 free는 C언어의 동적 할당 및 해제 함수
- 라이브러리가 제공하는 동적할당 함수.
- malloc함수는 동적할당할 메모리의 양을 바이트 단위로 인자에 넘기고 void*를 리턴. (사용할 타입에 맞추어 캐스팅)
- 메모리 할당이 목적이므로 생성하자마자 초기화가 불가능. 메모리 할당 후 초기화(대입) (calloc은 0으로 초기화)
- C++에서 new/delete는 할당/해제 + 생성자 및 소멸자를 호출. malloc과 free는 오로지 메모리만을 할당/해제.
- 할당된 메모리를 realloc을 통해 크기를 바꿀 수 있음. C++의 new는 이러한 기능은 없음.
new와 delete는 C++언어의 동적 할당 및 해제 연산자 (오버로딩 가능)
- 언어에서 지원하는(문법) 동적할당 연산자
- 할당할 타입의 메모리 만큼 동적할당. (int 4바이트. 사용자 정의 class가 16바이트면 16바이트 할당)
- 생성자 및 소멸자 자동 호출. (생성자 오버로딩 시 매개변수 타입에 맞게 인자를 넣어줄 시 해당하는 생성자 호출)
- 할당과 동시에 초기화 가능. (넘겨준 인자를 통해 생성자에서 초기화 리스트를 이용하여 초기화)
- realloc에 해당하는 기능은 없음.
malloc/free 및 new/delete는 꼭 짝을 맞춰서 사용해야 하며, 저 둘을 섞어 사용은 불가능하다.
참조자
- 변수라는 것은 할당된 메모리 공간에 붙여진 이름(식별자).
- 참조자는 할당된 하나의 메모리 공간에 다른 이름을 붙이는 것(별칭이라고도 한다)
int main()
{
int a = 10;
int& ref = a;
ref = 50;
std::cout << a << " " << ref;
return 0;
}
실행해보면 같은 값이 나온다.
즉 실제 a의 값이 변경 되었다는 것.
이렇게 참조자를 만드는 방법은 자료형의 타입 뒤에 &를 붙이면 된다.
- 별칭을 붙이고 싶은 자료형의 뒤에 &.
이렇게보면 포인터와 참조자가 매우 비슷해보이지만 몇가지 중요한 차이점이 존재한다.
1. 레퍼런스는 선언 후 누구의 별칭이 될 것인지 지정해줘야 한다. (바로 초기화가 되어야함)
이렇게 선언만 해두고 나중에 할당하는 행위는 불가능하다.
- 반대로 포인터는 가능.
그 이유는 참조자는 누군가의 별칭이 되면 다시는 다른 메모리의 별칭이 될 수 없기때문.
int main()
{
int a = 10;
int& ref = a;
int b = 60;
ref = b; // 그저 a의(ref) 메모리 공간에 60이라는 값을 대입하는 것.
return 0;
}
포인터는 마음껏 다른 메모리의 주소로 변경 가능하다.
편리한 기능이지만 참조자를 반환하는 함수에서 지역변수를 반환하면 안된다.
-> 해당 함수의 스택 프레임은 날라가고 그안에 존재했던 지역변수,매개변수들의 메모리는 날라가므로.