프로그래밍/C++
[C++11] std::unique_ptr에 대해서
Changun An
2023. 5. 2. 01:52
반응형
| 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
std::unique_ptr - cppreference.com
(1) (since C++11) template < class T, class Deleter > class unique_ptr ; (2) (since C++11) std::unique_ptr is a smart pointer that owns and manages another object through a pointer and disposes of that object when the unique_ptr goes out of sco
en.cppreference.com
Effective Modern C++ - 스콧 마이어스
반응형