하루의 쉼터

[C++11] std::unique_ptr에 대해서 본문

프로그래밍/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++ - 스콧 마이어스

반응형
Comments