<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=BoostLibrary%2FSmartPointer</id>
	<title>BoostLibrary/SmartPointer - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=BoostLibrary%2FSmartPointer"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=BoostLibrary/SmartPointer&amp;action=history"/>
	<updated>2026-05-14T21:27:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=BoostLibrary/SmartPointer&amp;diff=29392&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:22, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=BoostLibrary/SmartPointer&amp;diff=29392&amp;oldid=prev"/>
		<updated>2021-02-07T05:22:38Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;스마트 포인터 쓰기&lt;br /&gt;
----&lt;br /&gt;
== 설치 ==&lt;br /&gt;
* [http://boost.org/ boost] 에 가서 다운받고 설치한다.&lt;br /&gt;
* boost 라이브러리는 헤더 파일만이 존재한다. 모든 구현을 헤더 파일에 해 놓았기 때문이다. 바로 필살 헤더와 구현 분리하기 귀잖어 기술....본인은 애용한다...&lt;br /&gt;
&lt;br /&gt;
== shared_ptr ==&lt;br /&gt;
* new 를 해주고 delete 하는 것 에서 해방을!&lt;br /&gt;
* 표준 라이브러리에도 auto_ptr 이라고 같은 개념의 클래스가 있지만, 버그가 있다. -_-;; auto_ptr를 컨테이너에 집어넣으면 버그땜시 스스로 삭제가 안되 메모리가 새는 아주 심각한 문제이다.&lt;br /&gt;
 ...&lt;br /&gt;
 #include &amp;amp;lt;boost/smart_ptr.hpp&amp;amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 using namespace boost;&lt;br /&gt;
 ...&lt;br /&gt;
 class Vertex3D {...}&lt;br /&gt;
 typedef shared_ptr&amp;amp;lt;Vertex3D&amp;amp;gt; Vertex3DSPtr;&lt;br /&gt;
 typedef vector&amp;amp;lt;Vertex3DSPtr&amp;amp;gt; Vertexs; // 단어 틀렸다는거 알지만 그냥 씀 -_-&lt;br /&gt;
 typedef Vertexs::size_type VertexsSize;&lt;br /&gt;
 typedef Vertexs::iterator VertexsItr;&lt;br /&gt;
 typedef shared_ptr&amp;amp;lt;Vertexs&amp;amp;gt; VertexsSPtr;&lt;br /&gt;
 ...&lt;br /&gt;
 {&lt;br /&gt;
   VertexsSPtr vertexs(new Vertexs);&lt;br /&gt;
   Vertex3DSPtr vertex(new Vertex3D);&lt;br /&gt;
   ...&lt;br /&gt;
   vertexs-&amp;amp;gt;push_back(vertex);&lt;br /&gt;
   ...&lt;br /&gt;
 }&lt;br /&gt;
* new 를 했지만 delete 를 안해도 지가 알아서 사라진다.&lt;br /&gt;
* 모든 객체에 스마트포인터를 쓰도록 프로그램 짜면 자바같은 느낌으로 짤수도 ...&lt;br /&gt;
 &lt;br /&gt;
=== shared_ptr_example ===&lt;br /&gt;
shared_ptr_example.cpp&lt;br /&gt;
 //  Boost shared_ptr_example.cpp  --------------------------------------------//&lt;br /&gt;
 &lt;br /&gt;
 //  (C) Copyright Beman Dawes 2001. Permission to copy,&lt;br /&gt;
 //  use, modify, sell and distribute this software is granted provided this&lt;br /&gt;
 //  copyright notice appears in all copies. This software is provided &amp;quot;as is&amp;quot;&lt;br /&gt;
 //  without express or implied warranty, and with no claim as to its&lt;br /&gt;
 //  suitability for any purpose.&lt;br /&gt;
 &lt;br /&gt;
 //  See http://www.boost.org for most recent version including documentation.&lt;br /&gt;
 &lt;br /&gt;
 //  Revision History&lt;br /&gt;
 //  21 May 01  Initial complete version (Beman Dawes)&lt;br /&gt;
 &lt;br /&gt;
 //  The original code for this example appeared in the shared_ptr documentation.&lt;br /&gt;
 //  Ray Gallimore pointed out that foo_set was missing a Compare template&lt;br /&gt;
 //  argument, so would not work as intended.  At that point the code was&lt;br /&gt;
 //  turned into an actual .cpp file so it could be compiled and tested.&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;set&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;boost/shared_ptr.hpp&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 //  The application will produce a series of&lt;br /&gt;
 //  objects of type Foo which later must be&lt;br /&gt;
 //  accessed both by occurrence (std::vector)&lt;br /&gt;
 //  and by ordering relationship (std::set).&lt;br /&gt;
 &lt;br /&gt;
 struct Foo&lt;br /&gt;
 {&lt;br /&gt;
   Foo( int _x ) : x(_x) {}&lt;br /&gt;
   ~Foo() { std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Destructing a Foo with x=&amp;quot; &amp;amp;lt;&amp;amp;lt; x &amp;amp;lt;&amp;amp;lt; &amp;quot;\n&amp;quot;; }&lt;br /&gt;
   int x;&lt;br /&gt;
   /* ... */&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 typedef boost::shared_ptr&amp;amp;lt;Foo&amp;amp;gt; FooPtr;&lt;br /&gt;
 &lt;br /&gt;
 struct FooPtrOps&lt;br /&gt;
 {&lt;br /&gt;
   bool operator()( const FooPtr &amp;amp;amp; a, const FooPtr &amp;amp;amp; b )&lt;br /&gt;
     { return a-&amp;amp;gt;x &amp;amp;gt; b-&amp;amp;gt;x; }&lt;br /&gt;
   void operator()( const FooPtr &amp;amp;amp; a )&lt;br /&gt;
     { std::cout &amp;amp;lt;&amp;amp;lt; a-&amp;amp;gt;x &amp;amp;lt;&amp;amp;lt; &amp;quot;\n&amp;quot;; }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   std::vector&amp;amp;lt;FooPtr&amp;amp;gt;         foo_vector;&lt;br /&gt;
   std::set&amp;amp;lt;FooPtr,FooPtrOps&amp;amp;gt;  foo_set; // NOT multiset!&lt;br /&gt;
 &lt;br /&gt;
   FooPtr foo_ptr( new Foo( 2 ) );&lt;br /&gt;
   foo_vector.push_back( foo_ptr );&lt;br /&gt;
   foo_set.insert( foo_ptr );&lt;br /&gt;
 &lt;br /&gt;
   foo_ptr.reset( new Foo( 1 ) );&lt;br /&gt;
   foo_vector.push_back( foo_ptr );&lt;br /&gt;
   foo_set.insert( foo_ptr );&lt;br /&gt;
 &lt;br /&gt;
   foo_ptr.reset( new Foo( 3 ) );&lt;br /&gt;
   foo_vector.push_back( foo_ptr );&lt;br /&gt;
   foo_set.insert( foo_ptr );&lt;br /&gt;
 &lt;br /&gt;
   foo_ptr.reset ( new Foo( 2 ) );&lt;br /&gt;
   foo_vector.push_back( foo_ptr );&lt;br /&gt;
   foo_set.insert( foo_ptr );&lt;br /&gt;
 &lt;br /&gt;
   std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;foo_vector:\n&amp;quot;;&lt;br /&gt;
   std::for_each( foo_vector.begin(), foo_vector.end(), FooPtrOps() );&lt;br /&gt;
 &lt;br /&gt;
   std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;\nfoo_set:\n&amp;quot;;&lt;br /&gt;
   std::for_each( foo_set.begin(), foo_set.end(), FooPtrOps() );&lt;br /&gt;
   std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 //  Expected output:&lt;br /&gt;
 //&lt;br /&gt;
 //   foo_vector:&lt;br /&gt;
 //   2&lt;br /&gt;
 //   1&lt;br /&gt;
 //   3&lt;br /&gt;
 //   2&lt;br /&gt;
 //&lt;br /&gt;
 //   foo_set:&lt;br /&gt;
 //   3&lt;br /&gt;
 //   2&lt;br /&gt;
 //   1&lt;br /&gt;
 //&lt;br /&gt;
 //   Destructing a Foo with x=2&lt;br /&gt;
 //   Destructing a Foo with x=1&lt;br /&gt;
 //   Destructing a Foo with x=3&lt;br /&gt;
 //   Destructing a Foo with x=2&lt;br /&gt;
 &lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== shared_ptr_example2 ===&lt;br /&gt;
shared_ptr_example2.hpp (헉 이너클래스가 되네.. 처음봤다 --;;)&lt;br /&gt;
 //  Boost shared_ptr_example2 header file  -----------------------------------//&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;boost/shared_ptr.hpp&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 //  This example demonstrates the handle/body idiom (also called pimpl and&lt;br /&gt;
 //  several other names).  It separates the interface (in this header file)&lt;br /&gt;
 //  from the implementation (in shared_ptr_example2.cpp).&lt;br /&gt;
 &lt;br /&gt;
 //  Note that even though example::implementation is an incomplete type in&lt;br /&gt;
 //  some translation units using this header, shared_ptr&amp;amp;lt; implementation &amp;amp;gt;&lt;br /&gt;
 //  is still valid because the type is complete where it counts - in the&lt;br /&gt;
 //  shared_ptr_example2.cpp translation unit where functions requiring a&lt;br /&gt;
 //  complete type are actually instantiated.&lt;br /&gt;
 &lt;br /&gt;
 class example&lt;br /&gt;
 {&lt;br /&gt;
  public:&lt;br /&gt;
   example();&lt;br /&gt;
   example( const example &amp;amp;amp; );&lt;br /&gt;
   example &amp;amp;amp; operator=( const example &amp;amp;amp; );&lt;br /&gt;
   void do_something();&lt;br /&gt;
  private:&lt;br /&gt;
   class implementation;&lt;br /&gt;
   boost::shared_ptr&amp;amp;lt; implementation &amp;amp;gt; _imp; // hide implementation details&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
shared_ptr_example2.cpp&lt;br /&gt;
 // Boost shared_ptr_example2 implementation file  -----------------------------//&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;shared_ptr_example2.hpp&amp;quot;&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 class example::implementation&lt;br /&gt;
 {&lt;br /&gt;
  public:&lt;br /&gt;
   ~implementation() { std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;destroying implementation\n&amp;quot;; }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 example::example() : _imp( new implementation ) {}&lt;br /&gt;
 example::example( const example &amp;amp;amp; s ) : _imp( s._imp ) {}&lt;br /&gt;
 &lt;br /&gt;
 example &amp;amp;amp; example::operator=( const example &amp;amp;amp; s )&lt;br /&gt;
   { _imp = s._imp; return *this; }&lt;br /&gt;
 &lt;br /&gt;
 void example::do_something()&lt;br /&gt;
   { std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;use_count() is &amp;quot; &amp;amp;lt;&amp;amp;lt; _imp.use_count() &amp;amp;lt;&amp;amp;lt; &amp;quot;\n&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
shared_ptr_example2_test.cpp&lt;br /&gt;
 // Boost shared_ptr_example2_test main program  ------------------------------//&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;shared_ptr_example2.hpp&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   example a;&lt;br /&gt;
   a.do_something();&lt;br /&gt;
   example b(a);&lt;br /&gt;
   b.do_something();&lt;br /&gt;
   example c;&lt;br /&gt;
   c = a;&lt;br /&gt;
   c.do_something();&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
See Also [http://dalsu.80port.net/wiki/wiki.php/boost/shared_ptr Boost의 shared_ptr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
BoostLibrary&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>