스마트 포인터
는 c++11부터 지원하는 기능으로, 메모리관리를 위한 기능이다.
c++는 new를 사용해서 포인터로 실제 메모리를 가리키도록 하는데, new를 사용할 경우 다 사용한 후에 메모리를 해제해줘야 한다.(delete, nullptr)
그래서 스마트 포인터를 사용해서 자동으로 메모리 해제를 해서 메모리 관리의 효율성을 높힐 수 있다.
이전 언리얼엔진의 가비지컬렉션과 비교하여 언리얼오브젝트가 아닌 c++오브젝트의 경우 스마트 포인터로 메모리 누수, 댕글링 포인터, 와일드 포인터 문제를 해결한다고 했는데 그게 이거다.
스마트 포인터 종류
종류는 크게 3가지가 있다.
- unique_ptr
- shared_ptr
- weak_ptr
shared_ptr
using NodeRef = shared_ptr<struct Node>;
struct Node
{
Node() { } // 생성자
Node(const string& data) : data(data) { }
string data;
vector<NodeRef> children;
};
NodeRef CreateTree()
{
NodeRef root = make_shared<Node>("R1 개발실");
{
NodeRef node = make_shared<Node>("디자인팀");
root->children.push_back(node);
{
NodeRef leaf = make_shared<Node>("전투");
node->children.push_back(leaf);
}
}
}
void PrintTree(NodeRef root, int depth)
{
for (int i = 0; i < depth; i++)
cout << "-";
cout << root->data << endl;
for (NodeRef& child : root->children)
PrintTree(child, depth + 1);
}
using NodeRef = shared_ptr<struct Node>;
: 스마트 포인터를 NodeRef 로 선언했다. 당연하지만, type은 struct뿐만 아니라 int, class등 다양하게 가능
NodeRef root = make_shared<Node>("R1 개발실");
: make_shared를 통해 shared_ptr 인스턴스(객체)를 안전하게 생성할 수 있다.
: 가령 shared_ptr 객체 A를 new로 만들고, B = A; 이런식으로 B를 만들면, 주소값만 복사하는 얕은 복사이므로 메모리 해제를 할 때 오류가 발생할 수 있다고 한다.
for (NodeRef& child : root->children)
PrintTree(child, depth + 1);
: 어쨌든 shared_ptr 자체는 포인터, 즉 주소를 가리키는 것 이므로, 주소값 안에 있는 데이터를 받고 싶으면,
: NodeRef& child 이런식으로 작성해야한다.
: 추가적으로 주소값 안에 있는 데이터를 변경하지 못하게 하려면? const를 앞에 작성하면 된다.
(const의 위치, &의 위치에 따라 의미하는게 조금씩 다른게 있는데 따로 정리)
'하고싶은거 > C++' 카테고리의 다른 글
싱크홀 메우기 (업데이트중) (1) | 2024.04.17 |
---|---|
타입 변환 연산자 (0) | 2024.04.13 |
빠른 입출력, 실행속도를 높이기 위한 수단 (백준 15552) (0) | 2024.03.17 |
이것저것 기억하고 싶은거 글쓰는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!