GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — interprocess/example/doc_bufferstream.cpp at develop · boostorg/interprocess Expand file tree/ Copy pathdoc_bufferstream.cppMore file actions 94 lines (80 loc) · 2.72 KB / Copy pathdoc_bufferstream.cppFile metadata and controls94 lines (80 loc) · 2.72 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 ////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2006-2012. 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. // ////////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG #undef NDEBUG #endif #include <boost/interprocess/detail/workaround.hpp> //[doc_bufferstream #include <boost/interprocess/managed_shared_memory.hpp> #include <boost/interprocess/streams/bufferstream.hpp> #include <vector> #include <iterator> #include <algorithm> //std::copy, std::equal #include <cstddef> //<- #include "../test/get_process_id_name.hpp" //-> using namespace boost::interprocess; int main () { //Remove shared memory on construction and destruction struct shm_remove { shm_remove() { shared_memory_object::remove(test::get_process_id_name()); } ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); } } remover; //<- (void)remover; //-> //Create shared memory managed_shared_memory segment(create_only,test::get_process_id_name(), 65536); //Fill data std::vector<int> data; data.reserve(100); for(std::size_t i = 0; i < 100; ++i){ data.push_back((int)i); } const std::size_t BufferSize = 100*5; //Allocate a buffer in shared memory to write data char *my_cstring = segment.construct<char>("MyCString")[BufferSize]('\0'); bufferstream mybufstream(my_cstring, BufferSize); //Now write data to the buffer for(std::size_t i = 0; i < 100; ++i){ mybufstream << data[i] << std::endl; } //Check there was no overflow attempt assert(mybufstream.good()); //Extract all values from the shared memory string //directly to a vector. std::vector<int> data2; std::istream_iterator<int> it(mybufstream), itend; std::copy(it, itend, std::back_inserter(data2)); //This extraction should have ended will fail error since //the numbers formatted in the buffer end before the end //of the buffer. (Otherwise it would trigger eofbit) assert(mybufstream.fail()); //Compare data assert(std::equal(data.begin(), data.end(), data2.begin())); //Clear errors and rewind mybufstream.clear(); mybufstream.seekp(0, std::ios::beg); //Now write again the data trying to do a buffer overflow for(std::size_t i = 0, m = data.size()*5; i < m; ++i){ mybufstream << data[i%5u] << std::endl; } //Now make sure badbit is active //which means overflow attempt. assert(!mybufstream.good()); assert(mybufstream.bad()); segment.destroy_ptr(my_cstring); return 0; } //] |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |