프로그래밍/C++

동적할당

우대비 2022. 10. 20. 16:22
반응형

동적할당 - 동적으로 메모리를 할당하는거~

쓸때만 쓰고 안쓰면 반납이 가능하기에 효율적인 메모리 관리가 가능하다는게 특징임~

class Monster
{
public:
        Monster(){cout << "Monster() "<< endl;}
        ~Monster(){cout << "~Monster() "<< endl;}
public:
        int _hp;
        int _x;
        int _y;
};

동적할당 함수

- malloc / free

 

동적할당 연산자

- new / delete

- malloc/ free와 new/ delete의 차이

1. 사용 편의성은 new/ delete가 좋지만 타입에 상관없이 특정한 사이즈의 메모리를 할당하고자 할때는

malloc / free를 사용하는게 좋음

2. new/delete는 생성자와 소멸자를 호출해주지만 malloc/ free는 그렇지 않음..!  ( 중요 )

 


malloc / free

        void* ptr = malloc(sizeof(Monster));
        Monster* m1 = (Monster*)ptr;
        m1->_hp = 100;
        m1->_x = 1;
        m1->_y = 1;
        
        free(pointer);

'void 형식의 pointer'에 'Monster 클래스의 크기'만큼 메모리를 할당해줌

형식이 void인 이유는 '그 주소안에 뭐가 있을지 모르니 알잘딱 해라!' 라는 의미!

 

'Monster 클래스의 크기만큼 메모리를 할당받은 ptr'을 'Monster Pointer'로 변환해줌

Monster 형식으로 변환된 메모리를 Monster 클래스마냥 사용~

 

Monster 클래스를 생성하는게 아니라 메모리를 Monster 클래스인것 마냥 사용하는 것이기 때문에

당연하게도 생성자, 소멸자는 호출이 안됨..!


new / delete

        Monster* m2 = new Monster;
        m2->_hp = 200;
        m2->_x = 2;
        m2->_y = 2;
        delete m2;

        Monster* m3 = new Monster[5];
        m3->_hp = 300;
        m3->_x = 3;
        m3->_y = 3;

        
        m3[1]._hp = 300;
        m3[1]._x = 3;
        m3[1]._y = 3;

        m3[2]._hp = 300;
        m3[2]._x = 3;
        m3[2]._y = 3;

        m3[3]._hp = 300;
        m3[3]._x = 3;
        m3[3]._y = 3;

        Monster* m4 = (m3 + 4);
        m4->_hp = 400;
        m4->_x = 4;
        m4->_y = 4;

        delete[] m3;

'Monster클래스를 생성하고 그 주소값'을 'Monster Pointer인 m2'에 넣어줌

Monster 클래스를 생성해버리는 것이기 때문에 당연하게도 생성자, 소멸자가 호출됨..!

 

클래스 배열로도 생성이 가능!


free / delete

코드의 마지막 줄을 보면 free / delete가 꼭 들어있는 것을 볼 수 있는데

이건 메모리를 반납하는 거라고 보면 됨

사용하지 않는 메모리 공간을 반납함으로서 조금 더 효율적인 메모리 운용이 가능하고

메모리 누수를 예방 할 수 있음 따라서 new / malloc으로 만든 클래스의 마지막에는 반드시 free / delete를 꼭 넣어줘야 함

 

 

반응형
LIST

'프로그래밍 > C++' 카테고리의 다른 글

클래스의 복사  (0) 2022.10.22
virtual 소멸자  (0) 2022.10.22
초기화 리스트  (0) 2022.10.18
C++ 게임프로그래밍전문가자격증 필기 21-2 B형 2번 포인터 문제  (0) 2022.08.17
C++ 정수  (0) 2022.08.12