heap 공간을 잘 쓰지 않으면
memory leak이나 memory fragmentation에 직면할 것이다.
stack 대신에 heap memory를 쓰는 이유는
1. life cycle
2. large size
3. dynamic runtime 때문이다
life cycle 측면에서 보면, stack 공간은 함수가 종료하면 사라진다.
따라서 pointer를 활용해서 heap 공간에 계속 남아 있는 것을 쓰는 게 좋다
large size는
stack 공간은 size에 한계가 있다.
따라서 large size를 사용하기 위헤 heap 공간을 쓴다.
dynamic runtime이다.
stack 공간에 있는 내용은 compile시에 결정된다.
heap을 사용하면 runtime에 지정되는 것을 사용할 수 있다.
(고양이가 5마리가 들어올지 100마리가 들어올지는 컴파일 시간에 모름)
그리고 stl에서 vector는 heap 공간에 배정하고, 메모리 해제까지 해준다(smart pointer 기능)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#include <iostream>
#include <stdlib.h>
#include <memory>
#include <vector>
class Cat
{
public:
Cat()
{
std::cout << "meow" << std::endl;
};
~Cat()
{
std::cout << "bye" << std::endl;
};
private:
int mAge;
};
int main()
{
int* ip;
ip = new int;
*ip = 100;
delete ip; // Heap 공간에 있던 것만 삭제함(ip*는 stack 공간에 남아 있음)
//C style heap Cat
// 뭔가 이상하다 (destructor 안 나옴)
Cat* catp = (Cat*)malloc(sizeof(Cat));
free(catp);
// C style heap Cat array
// 뭔가 이상하다 (destructor 안 나옴)
// C style로는 객체를 만들지 말자.
// c++에서는 malloc이나 calloc을 사용하지 말자
// malloc 대신 new를 쓰고
// free 대신 delete를 쓰자
Cat* catap = (Cat*)malloc(sizeof(Cat) * 5);
free(catap);
//C++ style class cat
Cat* catapp_cpp = new Cat;
delete catapp_cpp;
//C++ style cat array class
Cat* catapp_cpp_array = new Cat[5];
delete[] catapp_cpp_array;
// Smart Pointer로 메모리 leak을 원천 차단해야 한다.
// c++ safer memory allocation
std::unique_ptr<Cat> catp_smart = std::make_unique<Cat>();
// 벡터를 사용하면 알아서 메모리 할당과 해제 해줌
// c++ style heap Cats(cat array)
std::vector<Cat> cats(5);
// C++ style safer heap int
std::unique_ptr<int> ip_cppstyle = std::make_unique<int>();
std::vector<int> ints(5);
// Dynamic Allocation using heap memory space
std::cout << "How many cats do you need?" << std::endl;
int catCount;
std::cin >> catCount;
std::vector<Cat> catsvector(catCount);
// C style heap int
int* cip = (int*)malloc(sizeof(int));
*cip = 100;
free(cip);
//C style heap array
int* cip_array = (int*)malloc(sizeof(int) * 5);
cip_array[0] = 100;
free(cip_array);
return 0;
}
|
'C' 카테고리의 다른 글
c++ copy elison, Retrun value optimization (0) | 2021.06.23 |
---|---|
c++ lvalue rvalue zero copy (0) | 2021.06.23 |
c++ stack 공간, class, struct, 타입별 메모리 사이즈 (0) | 2021.06.22 |
c++ extern static 기록 정리 (0) | 2021.06.22 |
c++ preprocessor 공부기록 ifdef, replace (0) | 2021.06.22 |