Apply patch for [CVE-2012-2677][boost] ordered_malloc() overflow
[external/boost.git] / libs / interprocess / example / doc_shared_ptr_explicit.cpp
1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2006-2009.
4 // Distributed under the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // See http://www.boost.org/libs/interprocess for documentation.
9 //
10 //////////////////////////////////////////////////////////////////////////////
11 #include <boost/interprocess/detail/config_begin.hpp>
12 #include <boost/interprocess/detail/workaround.hpp>
13
14 //[doc_shared_ptr_explicit
15 #include <boost/interprocess/managed_shared_memory.hpp>
16 #include <boost/interprocess/smart_ptr/shared_ptr.hpp>
17 #include <boost/interprocess/allocators/allocator.hpp>
18 #include <boost/interprocess/smart_ptr/deleter.hpp>
19 #include <cassert>
20 //<-
21 #include "../test/get_process_id_name.hpp"
22 //->
23
24 using namespace boost::interprocess;
25
26 //This is type of the object we want to share
27 class MyType
28 {};
29
30 typedef managed_shared_memory::segment_manager segment_manager_type;
31 typedef allocator<void, segment_manager_type>  void_allocator_type;
32 typedef deleter<MyType, segment_manager_type>  deleter_type;
33 typedef shared_ptr<MyType, void_allocator_type, deleter_type> my_shared_ptr;
34
35 int main ()
36 {
37    //Remove shared memory on construction and destruction
38    struct shm_remove
39    {
40    //<-
41    #if 1
42       shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
43       ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
44    #else
45    //->
46       shm_remove() { shared_memory_object::remove("MySharedMemory"); }
47       ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
48    //<-
49    #endif
50    //->
51    } remover;
52
53    //<-
54    #if 1
55    managed_shared_memory segment(create_only, test::get_process_id_name(), 4096);
56    #else
57    //->
58    managed_shared_memory segment(create_only, "MySharedMemory", 4096);
59    //<-
60    #endif
61    //->
62    
63    //Create a shared pointer in shared memory
64    //pointing to a newly created object in the segment
65    my_shared_ptr &shared_ptr_instance =
66       *segment.construct<my_shared_ptr>("shared ptr")
67          //Arguments to construct the shared pointer
68          ( segment.construct<MyType>("object to share")()      //object to own
69          , void_allocator_type(segment.get_segment_manager())  //allocator
70          , deleter_type(segment.get_segment_manager())         //deleter
71          );
72    assert(shared_ptr_instance.use_count() == 1);
73
74    //Destroy "shared ptr". "object to share" will be automatically destroyed
75    segment.destroy_ptr(&shared_ptr_instance);
76
77    return 0;
78 }
79 //]
80 #include <boost/interprocess/detail/config_end.hpp>