티스토리 뷰

개발/일상

Boost noncopyable

clucle 2019. 7. 19. 01:20

서버 공부를 하면서 클래스에 boost::noncopyable 을 상속받은 이유가 궁금해서 찾아보고 정리하게 되었습니다.

 

https://stackoverflow.com/questions/3518853/what-are-use-cases-for-boosternoncopyable

 

https://www.boost.org/doc/libs/1_44_0/libs/utility/utility.htm#Class_noncopyable

 

Boost 공식 문서에서 나온 설명은

 

Some objects, particularly those which hold complex resources like files or network connections, have no sensible copy semantics.  Sometimes there are possible copy semantics, but these would be of very limited usefulness and be very difficult to implement correctly.  

 

복잡한 리소스를 가지는 객체가 복사된다면, 클래스를 free 시키거나 네트워크 파일을 close 할 때 다루기가 힘들어진다. 

 

이를 막기 위해 noncopyable 을 사용한다.

 

 - noncopyable을 사용하지 않았을 때, useless_resources 가 복사되어 잘 동작한다.

 

클래스가 복사되는 모습

 

- noncopyable을 사용했을때, 복사가 동작하지 않아 에러가난다.

 

= 에서 복사 될 수 없기 때문에 에러가 나는 모습

 

중요한 리소스를 다루거나, 복사되면 안되는 객체에는 boost::noncopyable 을 상속하거나

 

#include <iostream>
#include <boost/noncopyable.hpp>

using namespace std;
using namespace boost;

class ComplexResources : boost::noncopyable{

public:
	int something = 0;
};

int main(int argc, char** argv) {
	ComplexResources origin_resources;
	origin_resources.something = 1;

	ComplexResources useless_resources;
	useless_resources = origin_resources;
	cout << useless_resources.something << '\n';
	return 0;
}

 

복사 생성자, 복사 대입 연산자를 private 에 선언해서 복사되지 않도록 하자

#include <iostream>

using namespace std;

class ComplexResources {

public:
	int something = 0;
	ComplexResources() {};

private:
	ComplexResources(const ComplexResources&);
	ComplexResources& operator=(const ComplexResources&) {};
};

int main(int argc, char** argv) {
	ComplexResources origin_resources;
	origin_resources.something = 1;

	ComplexResources useless_resources;
	useless_resources = origin_resources;
	cout << useless_resources.something << '\n';
	return 0;
}

 

'개발 > 일상' 카테고리의 다른 글

백준 학교 랭킹 30위 달성  (2) 2019.08.24
boost shared_from_this() bad_weak_ptr Exception 문제 해결  (0) 2019.08.13
boost::thread bind object  (0) 2019.08.07
c++ explicit 이란?  (0) 2019.07.27
개발 블로그 새로 시작!!  (0) 2019.07.19
댓글