Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 우분투
- while
- 기초
- 데이터 베이스
- JungOl
- 오늘도 우라라 펫
- Subscribe
- LeetCode
- 토픽
- 환경설정
- ros
- 반복문
- 오늘도 우라라
- install opencv-4.4.0 on ubuntu 22.04
- Linux
- mysql
- 프로그래밍
- 리눅스
- mariaDB
- C언어
- 그랑사가
- topic
- publish
- ubuntu
- 등차수열
- 오늘도 우라라 공략
- 마리아 DB
- MSG
- 오늘도 우라라 펫 공략
- C++
Archives
- Today
- Total
하루의 쉼터
[C++11] std::unique_ptr에 대해서 본문
반응형
| std::unique_ptr에 대해서
Exclusive Ownership,
- 포인터를 통해 다른 객체를 소유 및 관리하고 unique_ptr 범위를 벗어나면 해당 객체를 delete 하는 스마트 포인터이다.
- 하나의 포인터만이 객체를 가리키도록 하며 null 이 아닌 자신이 가리키는 객체를 소유한다.
따라서 복사가 허용 되지 않는다.
- 필요 헤더 : memory
- delete 조건
- unique_ptr 개체가 종료 되는 경우.
- opreator=, reset()을 사용하는 경우.
- 주된 사용처
- 단일 객체 소유 : 객체의 소유권을 명확하게 할당하고 다른 포인터에게 공유되지 않아야 하는 경우.
- 자원 관리 : new와 delete를 직접 사용하지 않고 안전하게 관리가 필요한 경우, 네트워크 연결 등 자원 관리가 필요한 경우.
- 객체 전달 : 함수의 매개변수로 사용하여 객체를 안전하게 이동 및 전달할 필요가 있는 경우.
- 예외 처리 : 함수가 종료 될 시 자동으로 메모리를 해제하여 메모리 누수 방지.
사용 형식
template<class T, class Deleter = std::default_delete<T>>class unique_ptr; -- (1)
template<class T, class Deleter> class unique_ptr<T[],Deleter>; -- (2)
1. 단일 객체 소유 예시
#include<iostream>
#include<memory>
int main() {
std::unique_ptr<int> test1(new int(10));
std::unique_ptr<int> test2 = std::move(test1);
if (test1 == nullptr) {
std::cout << "test1 is null" << '\n';
}
std::cout << *test2<<'\n';
return 0;
}
2. 자원 관리 예시
#include<iostream>
#include<memory>
class Test {
public:
Test() {
std::cout << "Constructor" << '\n';
}
virtual ~Test() {
std::cout << "Destructor" << '\n';
}
};
int main() {
auto t(std::make_unique<Test>());
if (t != nullptr) {
std::cout << "t is not null" << '\n';
}
t.reset();
if (t == nullptr) {
std::cout << "t is null" << '\n';
}
return 0;
}
3. 객체 전달 예시
#include<iostream>
#include<memory>
void print_unique_ptr(std::unique_ptr<int> up) {
std::cout << "unique_ptr: " << *up << std::endl;
// Destruct
}
int main() {
std::unique_ptr<int> up(new int(10));
print_unique_ptr(std::move(up));
if (up == nullptr) {
std::cout << "up is null" << std::endl;
}
return 0;
}
4. 예외 처리 예시
#include<iostream>
#include<memory>
void function_throw() {
std::unique_ptr<int> up(new int(10));
throw std::runtime_error("Excetpion");
if (up == nullptr) {
std::cout << "up is null" << std::endl;
}
}
int main() {
try {
function_throw();
}
catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << '\n';
}
return 0;
}
Reference :
https://en.cppreference.com/w/cpp/memory/unique_ptr
Effective Modern C++ - 스콧 마이어스
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] unsigned, signed 비교 주의 사항 (0) | 2023.06.01 |
---|---|
[C++11] std::is_same (0) | 2023.04.27 |
[UtilitiesLibrary] std::size_t - with unsigned int (0) | 2023.04.27 |
[BasicGrammar] Inline Function (0) | 2023.04.18 |
[BasicGrammar] FunctionPointer(함수포인터) - with. c++ (0) | 2023.04.16 |
Comments