C++ 프로그래밍

C++ Technical Report 1 : General Utilities

하늘흐늘 2009. 7. 24. 14:21
반응형

General Utilities
Reference Wrapper (tr1::reference_wrapper)
쉽게 말하여 함수포인터에 레퍼런스를 적용시키기 위해서 존재하는 듯 합니다. Wikipedia에서 발취한 예제는 아래와 같습니다.

#include <iostream>
#include <functional>
 
void f( int &r )  { ++r; }
 
template< class Funct, class Arg >
void g( Funct f, Arg t )
{
  f(t);
}
 
int main()
{
  int i = 0;
 
  g( f, i );                   // 'g< void(int &r), int >' is instantiated
  std::cout << i << "\n";      // Output: 0
 
  g( f, std::tr1::ref(i) );    // 'g< void(int &r), reference_wrapper<int> >' is instanced
  std::cout << i << "\n";      // Output: 1
}

Smart Pointers
shared_ptr

쉽게 말하여 reference counting을 하면서 resource를 관리하는 포인터입니다. shared_ptr에 의하여 지칭하는 객체를 shared_ptr사이에서 서로 공유합니다.

bool TTR1_SharedPtr01::Test()
{
	tr1::shared_ptr<ttest090722> test(new TTest090722());
	test->i=7;
	{
		//test2와 test은 객체를 공유함
		tr1::shared_ptr<ttest090722> test2(test);
		cout << "i: " << test2->i << " / ";
		cout << "Ref Count:" << test.use_count() << endl; //Ref Count: 2
	}
   //객체를 공유하던 test2가 소멸됨
	cout << "Ref Count:" << test.use_count() << endl; //Ref Count: 1


	return true;
}

weak_ptr
shared_ptr의 순환 참조의 문제를 해결하기 위하여 쓰는데 shared_ptr이 공유하는 객체를 weak_ptr도 공유하게 되는데 shared_ptr이 공유할 경우 reference counting이 변하는데 반하여 weak_ptr은 reference counting에 영향을 주지 않습니다. 그래서 쓸 떄도 직접 공유객체를 포인팅해서 쓸 수 없고 shared_ptr을 lock()함수를 이용하여 호출한 뒤에 쓸 수 있습니다.

bool TTR1_WeakPtr01::Test()
{
	tr1::shared_ptr<ttest090722> test(new TTest090722());
	test->i=7;
	{
		//test2와 test은 객체를 공유하지는 않지만 test2는 test 객체를 포인팅
		tr1::weak_ptr<ttest090722> test2(test);
		//test2.lock()을 하여 shared_ptr을 호출하여 test 객체를 호출함
		cout << "i: " << test2.lock()->i << " / "; 
		//weak_ptr은 reference counting에 관여하지 않음
		cout << "Ref Count:" << test.use_count() << endl; //Ref Count: 1
	}
	cout << "Ref Count:" << test.use_count() << endl; //Ref Count: 1


	return true;
}



참조사이트

Wikipedia C++ Technical Report 1 jacking님의 노트  '01. Boost C++0x TR1 - Install, array, shared_ptr, weak_ptr

'

MSDN weak_ptr Class



반응형