doc_shared_ptr_explicit.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2006-2012.
  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. //[doc_shared_ptr_explicit
  14. #include <boost/interprocess/managed_shared_memory.hpp>
  15. #include <boost/interprocess/smart_ptr/shared_ptr.hpp>
  16. #include <boost/interprocess/allocators/allocator.hpp>
  17. #include <boost/interprocess/smart_ptr/deleter.hpp>
  18. #include <cassert>
  19. //<-
  20. #include "../test/get_process_id_name.hpp"
  21. //->
  22. using namespace boost::interprocess;
  23. //This is type of the object we want to share
  24. class MyType
  25. {};
  26. typedef managed_shared_memory::segment_manager segment_manager_type;
  27. typedef allocator<void, segment_manager_type> void_allocator_type;
  28. typedef deleter<MyType, segment_manager_type> deleter_type;
  29. typedef shared_ptr<MyType, void_allocator_type, deleter_type> my_shared_ptr;
  30. int main ()
  31. {
  32. //Remove shared memory on construction and destruction
  33. struct shm_remove
  34. {
  35. //<-
  36. #if 1
  37. shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
  38. ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
  39. #else
  40. //->
  41. shm_remove() { shared_memory_object::remove("MySharedMemory"); }
  42. ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
  43. //<-
  44. #endif
  45. //->
  46. } remover;
  47. //<-
  48. (void)remover;
  49. //->
  50. //<-
  51. #if 1
  52. managed_shared_memory segment(create_only, test::get_process_id_name(), 4096);
  53. #else
  54. //->
  55. managed_shared_memory segment(create_only, "MySharedMemory", 4096);
  56. //<-
  57. #endif
  58. //->
  59. //Create a shared pointer in shared memory
  60. //pointing to a newly created object in the segment
  61. my_shared_ptr &shared_ptr_instance =
  62. *segment.construct<my_shared_ptr>("shared ptr")
  63. //Arguments to construct the shared pointer
  64. ( segment.construct<MyType>("object to share")() //object to own
  65. , void_allocator_type(segment.get_segment_manager()) //allocator
  66. , deleter_type(segment.get_segment_manager()) //deleter
  67. );
  68. assert(shared_ptr_instance.use_count() == 1);
  69. //Destroy "shared ptr". "object to share" will be automatically destroyed
  70. segment.destroy_ptr(&shared_ptr_instance);
  71. return 0;
  72. }
  73. //]
  74. #include <boost/interprocess/detail/config_end.hpp>