타입 변환 3: 포인터 타입 변환

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

공통 부분

 

class Item
{
public:
    Item() // 기본 생성자
    {
        cout << "Item()" << endl;
    }

    Item(const Item& item) // 복사 생성자
    {
        cout << "Item(const Item&)" << endl;
    }

    ~Item() // 소멸자
    {
        cout << "~Item()" << endl;
    }

public:
    int _itemType = 0;
    int _itemDbld = 0;

    char _cummy[4096] = {}; // 이런 저런 정보들로 인해 비대해진 아이템 클래스를 나타내기 위해 표시
};

 


 

생성자 / new delete 버젼

 

	// Stack [ type(4 byte) dbid(4) dummy(4096) ] 과 같이 영역이 잡혀있다.
    Item item;

	// Stack [ 주소(4~8 byte) ]  ->  Heap 주소[ type(4) dbid(4) dummy(4096) ]
	Item* item2 = new Item();

	TestItem(item);
	TestItem(*item2);

	TestItemPtr(&item);
	TestItemPtr(item2);

	// 밑의 delete가 없으면 메모리 누수(Memory Leak) -> 점점 가용 메모리가 줄어들어서 Crash
	delete item2;

생성자 버젼은 자동으로 소멸자를 호출하지만

new로 생성하면 delete를 작성해서 메모리를 해제시켜야 한다.  

 

 

출력화면

 

메모리 할당 크기

  메모리 크기  
 item  4104 byte  Stack [ type(4 byte) dbid(4) dummy(4096) ] 
 데이터가 통으로 복사된다.
 item2  4 byte  Stack [ 주소(4~8 byte) ]  ->  Heap 주소[ type(4) dbid(4) dummy(4096) ]
 포인터의 사이즈인 4 byte다. 주소값을 넘겨주는 방식이다.

 

 


 

 

배열

 

	cout << "--------------------" << endl;

	// 진짜 아이템이 100개 있는 것 (스택 메모리에 올라와 있다)
	Item item3[100] = {};

	cout << "--------------------" << endl;

	// 아이템이 100개 있을까요?
	// 아이템을 가리키는 바구니가 100개. 실제 아이템은 1개도 없을 수도 있음
	Item* item4[100] = {};

 

 

 


 

 

 

 

전체코드

 

더보기
#include <iostream>
using namespace std;

// 타입 변환 (포인터)

class Item
{
public:
    Item()
    {
        cout << "Item()" << endl;
    }

    Item(const Item& item)
    {
        cout << "Item(const Item&)" << endl;
    }

    ~Item()
    {
        cout << "~Item()" << endl;
    }

public:
    int _itemType = 0;
    int _itemDbld = 0;

    char _cummy[4096] = {}; // 이런 저런 정보들로 인해 비대해진 아이템 클래스를 나타내기 위해 표시
};

void TestItem(Item item) { }

void TestItemPtr(Item* item) { }

int main()
{
    // 복습
    {
        // Stack [ type(4) dbid(4) dummy(4096) ]
        Item item;

        // Stack [ 주소(4~8) ]  ->  Heap 주소[ type(4) dbid(4) dummy(4096) ]
        Item* item2 = new Item();

        TestItem(item);
        TestItem(*item2);

        TestItemPtr(&item);
        TestItemPtr(item2);

        // 메모리 누수(Memory Leak) -> 점점 가용 메모리가 줄어들어서 Crash
        delete item2;
    }

    // 배열
    {
        cout << "--------------------" << endl;

        // 진짜 아이템이 100개 있는 것 (스택 메모리에 올라와 있는)
        Item item3[100] = {};

        cout << "--------------------" << endl;

        // 아이템이 100개 있을까요?
        // 아이템을 가리키는 바구니가 100개. 실제 아이템은 1개도 없을 수도 있음
        Item* item4[100] = {};
    }

    return 0;
}