ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 동적할당
    프로그래밍 언어/C++ 2024. 7. 3. 16:12
    1. malloc / free            
    2. new / delete             
    3. new [] / delete[]       
    4. malloc과 new의 차이

     

    Malloc / Free

    [MALLOC]

    [반환타입]* [포인터이름] = malloc([사이즈])
    ex) void* pointer = malloc(sizeof([Class]))

    [Free]
    free([포인터이름])
    ex) free(pointer);
    • 특징
      • 사이즈 지정 가능
      • 생성자와 소멸자 호출 x
      • void* 포인터형을 사용할경우 class국한되지 않고 캐스팅을 통해 사용할 수 있다.
    • 주의
      • HeapOverFlow 주의
        • 사이즈를 지정해줘서 사용하므로, 해당 사이즈를 넘어가는 주소공간에 접근할 위험이 존재 (힙오버플로우)
      • Double Free
        • 이미 해제된 pointer의 경우, 한번 더 free를 해주면 크래쉬가 발생
      • Use After Free
        • 이미 해제된 영역을 사용할경우 메모리 침법위반으로 인해 크래쉬가 발생
        • 사용되지 않는 메모리공간일경우 바로 크래쉬가 발생하지 않을 수 있음
    class Monster
    {
    
    
    public:
    	int _hp;
    	int _attack;
    	int _test;
    };
    
    
    int main()
    {
    	// malloc , free의 경우 생성자, 소멸자를 호출하지 않는다!
    	void* pointer = malloc(sizeof(Monster));
    
    				// void형이기에 캐스팅을 통해서 어떤 포인터인지 알려준다.
    	Monster* m1 = (Monster*)pointer;
    
    	m1->_hp = 100;
    	m1->_attack = 1;
    
    
    	//HeapOverFlow
    	// - 유효한 힙 범위를 초과해서 사용하는 문제
        // - 4 바이트 할당
    	void* pointer4 = malloc(4);
    	Monster* m2 = (Monster*)pointer4;
    
    	// 다른 영역의 경우 할당받은 size가 아니기에, _attack or _test에서 크래쉬 남
    	m2->_hp = 4;
    	m2->_attack = 2;
    	m2->_test = 4;
    
    
    	free(pointer);
    	free(pointer4);
    
    	//Use After Free
    	//이미 free된 공간이라서, 나중에 크래쉬가 날 수 있다.
    	m1->_hp = 100;
        
    }

     

    New / Delete

    [NEW]

    [Type]* [포인터이름] = new [Type];
    ex) Monster* pointer = new Monster;

    [DELETE]
    delete [포인터이름];
    ex) delete pointer;
    • 특징
      • Type의 크기를 통해 사이즈 선정 가능 (int, double, class, ....)
      • 생성자와 소멸자를 호출
    • 주의
      • Double Delete
        • 이미 해제된 영역을 한번더 해제할 경우 크래쉬 발생
      • Use Aftrer Delete
        • 이미 해제된 영역을 접근할경우 메모리 침범이 발생해 크래쉬가 발생
    class Monster
    {
    
    
    public:
    	int _hp;
    	int _attack;
    	int _test;
    };
    
    
    int main()
    {
    	// new / delet
    	//[Type]* [포인터이름] = new [Type]
    	Monster* m3 = new Monster; // Monster Type
    	m3->_hp = 100;
    	m3->_attack = 10;
    	m3->_test = 2;
    
    
    	delete m3;
    	//delete m3; // Double Delete
    	//m3->_hp = 10; // delete된 영역 메모리 침범
    
    
    	
    
    }

     

    New [] / Delete[]

    [NEW []]

    [Type]* [포인터이름] = new [Type] [[개수]];
    ex) Monster* pointer = new Monster [5];

    [DELETE []]
    delete[] [포인터이름];
    ex) delete[] pointer;
    • 기본적으로 new/delete와 유사
    • 배열처럼 동적할당이 가능
    class Monster
    {
    
    
    public:
    	int _hp;
    	int _attack;
    	int _test;
    };
    
    
    
    int main()
    {
    
    	// new [] / delete[]
    	// [Type] [포인터이름] = new [Type] [개수]
    	Monster* m4 = new Monster[5];
    	m4->_hp = 100;
    
    	delete[] m4;
    
    }

     

     

    Malloc과 New의 차이

    • Malloc
      • 포인터를 통해서 생성하고 싶을 때 사용
      • 사이즈를 직접 지정하고 싶을때 사용
    • New
      • 생성자와 소멸자를 이용하고 싶을 때 사용

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

    포인터 타입변환  (0) 2024.07.04
    타입변환  (0) 2024.07.04
    static  (0) 2024.07.03
    연산자 오버로딩 (+대입연산자, 전위/후위연산자 )  (0) 2024.07.03
    클래스 초기화  (0) 2024.07.03
Designed by Tistory.