본문 바로가기
공부

[C, C++] 동적 할당, 해제

by MY블로그 2023. 5. 3.

동적할당 그리고 해제에 대하여 정리 합니다.

우선 기본 개념으로 C 언어에서의 동적할당과 C++ 언어에서의 동적할당은 같지않습니다.

양쪽모두 크게보자면 힙공간에 동적으로 메모리를 할당받아 저장 하는 것 입니다.동적할당을 하고난 후에는 해제를 해줘야합니다. 만일 해제 하지 않을 경우 메모리를 계속 가지고 있기 때문에 메모리 누수가 생길 수 있습니다.메모리 누수가 커질 수록 프로그램에 위험 합니다.

 


 

C언어 에서의 동적할당 및 해제

C언어 에서는 malloc 으로 할당 하며, free 로 해제 합니다.

struct Position
{
    int a;
    int b;
};
 int main()
{
    Position* ptr = (Position*)malloc(sizeof(Position)); // 동적 할당
	// ... 생략 ...
    free(ptr); //할당한 메모리의 작업이 끝난 후 해제
    return 0;
}

위와같이 구조체를 포인터를 사용하여 객체를 만들고 만들어진 객체에

(Position*)malloc(sizeof(Position)); 의 형식으로 동적할당을 실행합니다.

이후 다양한 작업들을 완료하고난 후 동적할당한 객체가 필요가 없어 졌을 경우

free(ptr) 처럼 free 함수를 이용하여 매개변수로 객체이름을 넣어 해제합니다.

 

 


 

C++언어 에서의 동적할당 및 해제

C++언어 에서는 new 으로 할당 하며, delete 로 해제 합니다.

struct Position
{
    int a;
    int b;
};
 int main()
{
    Position* ptr = new Position; // 동적 할당
	// ...생략...
    delete ptr; //할당한 메모리의 작업이 끝난 후 해제
    return 0;
}

기본 구조는 C언어와 유사합니다.

다만 생성한 객체에 복사대입하는 코드가 좀더 깔끔하고 간결해 진 모습입니다.

 


 

차이점?

코드만 다를뿐 같은 기능이지 않을까? 하는 생각을 할 수 있습니다.

하지만 자세히 알아본다면 조금 다릅니다.

malloc 보다는 new 에서 더 다양한 것을 해준다고 합니다.

new는 힙에 메모리할당을 해주고 생성자를 호출해주며 해당 타입으로 변환 까지 해주는 기능을 합니다!

malloc은 이러한 기능들이 제공되지 않습니다.

 

new뿐만이아닌 delete또한 free와는 다릅니다.

delete는 소멸자를 호출해주며 할당된 메모리를해제하는 기능을 합니다.

위의 차이점은 간단한 코드를 통하여 확인이 쉽게 가능 합니다.

#include <iostream>
using namespace std;

class Position
{
public:
    Position() //생성자
    {
        cout << "2) new의 생성자 호출 기능" << endl;
    }
    ~Position() //소멸자
    {
        cout << "3) delete의 소멸자 호출 기능" << endl;
    }
};

int main()
{
    // C 스타일 동적할당 해제 malloc & free
    Position* ptr = (Position*)malloc(sizeof(Position));
    cout << "1) malloc 의 동적할당 완료!생성자는 호출되었습니까? NO ! " << endl;
    free(ptr);

    cout << endl;

    // C++ 스타일 동적할당 해제 new & delete
    Position* ptr2 = new Position();
    cout << "1) new 의 동적할당 완료!생성자는 호출되었습니까? YES ! " << endl;
    delete(ptr2); 

    int a;
    cin >> a;
    return 0;
}

[ 출력결과 ]

위처럼 결과적으로 C언어의 동적할당 해제 방식은 생성자 소멸자를 호출해주지 않습니다.

그와 반대로 C++언어의 동적할당 해제 방식은 생성자 소멸자를 호출해주는 것을 볼 수 있습니다.

 

 


 

추가 VirtualAlloc & VirtualFree 에 대하여

C, C++ 의 두가지방식 말고 추가적인 방식에 대하여 알아봅니다.

WINAPI VirtualAlloc() 함수와 VirtualFree() 함수 입니다.

C언어의 동적할당과 해제의 이름과 유사한것으로 보아 비슷한 것이리라 유추할 수 있습니다.하지만 C언어의 동적할당인 malloc & free 보다 한단계 발전한 기능이라고 합니다.간단히 차이점을 보자면 malloc의 상태는 '확정' 이라는 상태만 있는데VirtualAlloc은 '확정' + '예약' 의 2가지 상태가 존재한다는 것입니다.

 

확정은 쉽게 말해 동적할당할꺼야! 하면 동적할당 지금바로했어! 라는 느낌이지만예약은 동적할당할꺼야! 하면 언제?라는 것이추가되어 당장 동적할당을 실시하여 메모리를 사용하는 것이아닌 나중에 동적할당 하겠다 라는 것만으로 직접적으로 메모리를 사용하지 않는 기능 입니다.

 

원하는 타이밍에 할당할수있는 기능이 있으니까 VirtualAlloc이 더 좋은 건가? 할수 있지만각상태는 따로 관리해줘야하기때문에 malloc 처럼 바로 할당하는 방식보다는 사용이 불편할 수도 있습니다.

 

VirtualFree또한 할당처럼 '확정' + '예약' 상태의 관리가 가능합니다!지금당장은 이런 것도 있구나 하는 간단한 정도로만 정리합니다.

댓글