Ion Gaztañaga writes:
El 21/07/2011 19:40, Nathan Lewis escribió:
Ion Gaztañaga writes:
What does "the data is not there" mean? You can't see it with the
debugger because pointers for shared memory are not raw pointers so the
debugger can't show values like with heap allocations.
Best,
Ion
_______________________________________________
Boost-users mailing list
Boost-users <at> lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Oh my, Ion I didn't realize that. One reason I was playing with the debugger was
because I was having trouble accessing the element in the vector via an
iterator. I believe that I've got the iterator set up correctly but can't figure
out why I can't print out the elements, what I am doing won't compile. I believe
the iterator is a char_string which is just a string that is allocated in the
shared memory. What I am trying to do is print it out in the loop below.
Ultimately I probably want to copy into regular strings on the other end when in
the application on the other end. I am pretty new to template parameters and
generic programming. If you don't mind correcting my thinking. Hopefully I'll be
able to stop bugging you. I can see my self using this part of boost a fair
amount just need to master it better. I've been pointing several other friends
the boost interprocess library and they are pretty impressed.
Regards,
This is the compile error I am getting:
error C2679: binary '<<' : no operator found which takes a right-hand operand of
type 'char_string_vector_iterator' (or there is no acceptable conversion)
ostream(653): could be 'std::basic_ostream<_Elem,_Traits> &std::operator
<<(std::basic_ostream<_Elem,_Traits> &,const char
*)' [found using argument-dependent lookup]
with[_Elem=char,_Traits=std::char_traits<char>] ...
#include
#include
#include
#include
#include
using namespace boost::interprocess;
using std::cout;
using std::endl;
//Typedefs of allocators and containers
typedef managed_shared_memory::segment_manager segment_manager_t;
typedef allocator void_allocator;
typedef allocator int_allocator;
typedef vector int_vector;
typedef allocator int_vector_allocator;
typedef vector int_vector_vector;
typedef allocator char_allocator;
typedef basic_string char_string;
typedef allocator char_string_allocator;
typedef vector char_string_vector_vector;
typedef char_string_vector_vector::iterator char_string_vector_iterator;
class complex_data
{
public: //Obviously making the variables of complex_data public isn't a good
idea I am just playing here for the moment
int id_;
char_string char_string_;
char_string_vector_vector char_string_vector_vector_;
double price_;
//Since void_allocator is convertible to any other allocator<T>, we simplify
//the initialization taking just one allocator for all inner containers.
complex_data(int id, const char *name, double prce, const void_allocator
&void_alloc)
: id_(id), char_string_(name, void_alloc),
char_string_vector_vector_(void_alloc), price_(prce)
{}
void addStringItem(const char* s)
{
//Every time you build from a raw string you need an allocator
//in the constructor
char_allocator alloc(char_string_vector_vector_.get_allocator());
char_string_vector_vector_.push_back(char_string(s, alloc));
}
};
int main ()
{
//Remove shared memory on construction and destruction
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
} remover;
//Create shared memory
managed_shared_memory segment(create_only,"MySharedMemory", 65536);
//An allocator convertible to any allocator type
void_allocator alloc_inst (segment.get_segment_manager());
char_string tempStr("whatever", alloc_inst);
cout << "tempStr = " << tempStr << endl;
//Construct the shared memory map and fill it
complex_data *mymap = segment.construct("Complex_Data")(7,
"hi", 7.0, alloc_inst);
mymap->addStringItem("hello");
mymap->addStringItem("how");
mymap->addStringItem("are");
mymap->addStringItem("you");
cout << "Size of char_string_vector_vector = " <<
mymap->char_string_vector_vector_.size();
char_string_vector_iterator it = mymap->char_string_vector_vector_.begin();
while (it != mymap->char_string_vector_vector_.end())
{
// error is on the line below
cout << "Inserted String is: " << it << endl;
it++;
}
//
return 0;
}