bdfgdfg

[C++] malloc,free VS new,delete + C++의 참조자 본문

게임프로그래밍/C++

[C++] malloc,free VS new,delete + C++의 참조자

marmelo12 2022. 1. 1. 19:57
반응형

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;
}

포인터는 마음껏 다른 메모리의 주소로 변경 가능하다.

 

편리한 기능이지만 참조자를 반환하는 함수에서 지역변수를 반환하면 안된다.

 -> 해당 함수의 스택 프레임은 날라가고 그안에 존재했던 지역변수,매개변수들의 메모리는 날라가므로.

 

반응형
Comments