[C++] 타입 변환 3: 포인터 타입 변환
타입 변환 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;
}
'⭐ Programming > C++' 카테고리의 다른 글
[C++] 얕은 복사 vs 깊은 복사 1 (0) | 2022.04.09 |
---|---|
[C++] 타입 변환 4: 포인터 (0) | 2022.04.09 |
[C++] 타입 변환 2: 참조 타입 변환 (0) | 2022.04.08 |
[C++] 타입 변환 1: 값, 타입 변환 / 암시적, 명시적 변환 (0) | 2022.04.08 |
[C++] 동적 할당: new, delete (0) | 2022.04.07 |
댓글
이 글 공유하기
다른 글
-
[C++] 얕은 복사 vs 깊은 복사 1
[C++] 얕은 복사 vs 깊은 복사 1
2022.04.09 -
[C++] 타입 변환 4: 포인터
[C++] 타입 변환 4: 포인터
2022.04.09 -
[C++] 타입 변환 2: 참조 타입 변환
[C++] 타입 변환 2: 참조 타입 변환
2022.04.08 -
[C++] 타입 변환 1: 값, 타입 변환 / 암시적, 명시적 변환
[C++] 타입 변환 1: 값, 타입 변환 / 암시적, 명시적 변환
2022.04.08