unique_ptr_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 151 行

CPP
151
字号
////////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga 2006. Distributed under the Boost// Software License, Version 1.0. (See accompanying file// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//// See http://www.boost.org/libs/interprocess for documentation.////////////////////////////////////////////////////////////////////////////////#include <boost/interprocess/detail/config_begin.hpp>#include <boost/interprocess/offset_ptr.hpp>#include <boost/interprocess/smart_ptr/unique_ptr.hpp>#include <boost/interprocess/managed_shared_memory.hpp>#include <boost/interprocess/allocators/allocator.hpp>#include <boost/interprocess/containers/list.hpp>#include <boost/interprocess/containers/set.hpp>#include <boost/interprocess/containers/vector.hpp>#include <boost/interprocess/containers/string.hpp>#include <boost/interprocess/smart_ptr/deleter.hpp>#include <stdio.h>#include <string>#include "get_process_id_name.hpp"using namespace boost::interprocess;class MyClass{   public:   MyClass()   {}};typedef managed_unique_ptr<MyClass, managed_shared_memory>::type my_unique_ptr_class;typedef set <my_unique_ptr_class            ,std::less<my_unique_ptr_class>            ,allocator  <my_unique_ptr_class                        ,managed_shared_memory::segment_manager>            > MySet;typedef list<my_unique_ptr_class            ,allocator  <my_unique_ptr_class                        ,managed_shared_memory::segment_manager>            > MyList;typedef vector <my_unique_ptr_class               ,allocator  <my_unique_ptr_class                           ,managed_shared_memory::segment_manager>            > MyVector;int main(){   std::string process_name;   test::get_process_id_name(process_name);   //Create managed shared memory   shared_memory_object::remove(process_name.c_str());   {      managed_shared_memory segment(create_only, process_name.c_str(), 10000);            //Create unique_ptr using dynamic allocation      my_unique_ptr_class my_ptr (segment.construct<MyClass>(anonymous_instance)()                                 ,segment.get_deleter<MyClass>());      my_unique_ptr_class my_ptr2(segment.construct<MyClass>(anonymous_instance)()                                 ,segment.get_deleter<MyClass>());      //Backup relative pointers to future tests      offset_ptr<MyClass> ptr1 = my_ptr.get();      offset_ptr<MyClass> ptr2 = my_ptr2.get();      //Test some copy constructors      my_unique_ptr_class my_ptr3(0, segment.get_deleter<MyClass>());      my_unique_ptr_class my_ptr4(detail::move_impl(my_ptr3));      //Construct a list and fill      MyList list(segment.get_segment_manager());      //Insert from my_unique_ptr_class      list.push_front(detail::move_impl(my_ptr));      list.push_back(detail::move_impl(my_ptr2));      //Check pointers      assert(my_ptr.get() == 0);      assert(my_ptr2.get() == 0);      assert(list.begin()->get() == ptr1);      assert(list.rbegin()->get() == ptr2);         //MyList list2(detail::move_impl(list));      //list2.swap(detail::move_impl(MyList(segment.get_segment_manager())));      //list.swap(detail::move_impl(MyList(segment.get_segment_manager())));      assert(list.begin()->get() == ptr1);      assert(list.rbegin()->get() == ptr2);      //Construct a set and fill      typedef std::less<my_unique_ptr_class> set_less_t;      MySet set(set_less_t(), segment.get_segment_manager());      //Insert in set from list passing ownership      set.insert(detail::move_impl(*list.begin()));      set.insert(detail::move_impl(*list.rbegin()));      //Check pointers      assert(list.begin()->get() == 0);      assert(list.rbegin()->get()== 0);      //A set is ordered by std::less<my_unique_ptr_class> so      //be careful when comparing pointers      if(ptr1 < ptr2){         assert(set.begin()->get()  == ptr1);         assert(set.rbegin()->get() == ptr2);      }      else{         assert(set.rbegin()->get() == ptr1);         assert(set.begin()->get()  == ptr2);      }      //Now with vector      MyVector vector(segment.get_segment_manager());      //Insert from my_unique_ptr_class      if(ptr1 < ptr2){         vector.insert(vector.begin(), detail::move_impl(*set.begin()));         vector.insert(vector.end(),   detail::move_impl(*set.rbegin()));      }      else{         vector.insert(vector.begin(), detail::move_impl(*set.rbegin()));         vector.insert(vector.end(),   detail::move_impl(*set.begin()));      }      //Check pointers      assert(my_ptr.get() == 0);      assert(my_ptr2.get() == 0);      assert(vector.begin()->get() == ptr1);      assert(vector.rbegin()->get() == ptr2);      MyVector vector2(detail::move_impl(vector));      vector2.swap(vector);      assert(vector.begin()->get() == ptr1);      assert(vector.rbegin()->get() == ptr2);      my_unique_ptr_class a(0, segment.get_deleter<MyClass>()), b(0, segment.get_deleter<MyClass>());      a = detail::move_impl(b);   }   shared_memory_object::remove(process_name.c_str());   return 0;}#include <boost/interprocess/detail/config_end.hpp>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?