SW/C++

C++ : unique_ptr : 배스트 프렉티스, 기본 예제, 활용 방법, 동작 방식

얇은생각 2020. 5. 6. 07:30
반응형

C++ : unique_ptr : 배스트 프렉티스, 기본 예제, 활용 방법, 동작 방식

 

std::unique_ptr

포인터 대신 아주 많이 활용되고 있습니다. 직접 메모리 관리하는 것 만큼 빠릅니다. Resource Acquisition is initialization 원칙에 잘 들어맞습니다. 자원 할당은 개체의 수명과 관련되어 있습니다. 생성자에서 new를 하고 소멸자에서 delete를 해주어야하는데 유니크 포인터 멤버 변수가 알아서 동작하여 줍니다. 따라서, 실수하기 어려우며, 다양한 곳에서 활용하여도 좋습니다.

 

 

예제

#include <memory>
#include <iostream>
#include "UsingUniquePointersExample.h"
#include "MyVector.h"

using namespace std;

namespace samples
{
	void UsingUniquePointersExample()
	{
		unique_ptr<int> num1 = make_unique<int>(10);
		unique_ptr<char> char1 = make_unique<char>('d');

		cout << *num1 << endl;
		cout << *char1 << endl;

		unique_ptr<MyVector> myVector = make_unique<MyVector>(3, 5);

		cout << "X: " << myVector->GetX() << ", Y: " << myVector->GetY() << endl;

		// Compiler error
		// unique_ptr<MyVector> copyOfMyVector1 = myVector;
		// unique_ptr<MyVector> copyOfMyVector2(myVector);

		myVector.reset(new MyVector(1, 5));

		cout << "X: " << myVector->GetX() << ", Y: " << myVector->GetY() << endl;

		num1.reset();
		myVector = nullptr;
		
		unique_ptr<char> char2(move(char1));

		// Run-time error
		//cout << "Char1: " << *char1 << endl;
		cout << "Char2: " << *char2 << endl;

		const unique_ptr<float> float1 = make_unique<float>(2.0f);

		// Compile error
		// unique_ptr<float> float2(move(float1));
		//float1.reset(new float(1.0f));
	}
}

 

원본 코드는 아래 경로에서 확인할 수 있습니다. 유니크 포인터는 기존 C++의 치명적인 단점을 완화시켜주는 녀석이라는 것을 알게 되었습니다. 포인터를 사용하는 곳에서는 가능한 많이 사용하여도 무방할 것 같습니다. 

 

https://github.com/POCU/COMP3200CodeSamples/blob/master/11/UsingUniquePointersExample.cpp

 

POCU/COMP3200CodeSamples

Code samples for COMP3200. Contribute to POCU/COMP3200CodeSamples development by creating an account on GitHub.

github.com

반응형