타입 변환 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;
}