[Interprocess] Problem with reserve for vector of weak_ptr
Hello,
I'm currently trying to store shared_ptr to data in a vector in
fixed_managed_shared_memory.
The problem is that my program is crashing during a weak_ptr assignment.
Since the problem is difficult to explain, I designed a little example
which crash every time for me :
#include <iostream>
#include <algorithm>
#include
On 27/05/2010 18:44, Gaetan Gaumer wrote:
Hello, I'm currently trying to store shared_ptr to data in a vector in fixed_managed_shared_memory. The problem is that my program is crashing during a weak_ptr assignment. Since the problem is difficult to explain, I designed a little example which crash every time for me :
I'll look into this but... shouldn't you "resize" instead of "reserve? Best, Ion
2010/5/27 Ion Gaztañaga
On 27/05/2010 18:44, Gaetan Gaumer wrote:
Hello, I'm currently trying to store shared_ptr to data in a vector in fixed_managed_shared_memory. The problem is that my program is crashing during a weak_ptr assignment. Since the problem is difficult to explain, I designed a little example which crash every time for me :
I'll look into this but... shouldn't you "resize" instead of "reserve?
Resize can trim the vector and I don't want it. I think "reserve" is the right function for my need. When I use push_back instead of operator[] there is no pb. For info I use gcc44 (don't have the version right now) on a 64b Linux. Best regards, Gaëtan
Resize can trim the vector and I don't want it. I think "reserve" is the right function for my need.
When I use push_back instead of operator[] there is no pb.
As Ion is probably just pointing out, there's a fundamental difference between resize and reserve. Resize modifies the "logical size" of the container, creating (by default construction) new entries, or removing (with destruction) entries. Reserve does not change the "logical size", and it's only use is as an implementation optimization (you can pre-assign internal buffer space, so that when adding new entries later on a memory allocation will already have occurred). For a vector, you can create one and then reserve one all you want, but the size is still 0 (until "push_back" or "insert", etc is performed), and indexing into the vector will be out of bounds. Read Josuttis C++ standard library book, or any good reference on the difference. Cliff
2010/5/28 Cliff Green
Resize can trim the vector and I don't want it. I think "reserve" is the right function for my need.
When I use push_back instead of operator[] there is no pb.
As Ion is probably just pointing out, there's a fundamental difference between resize and reserve. Resize modifies the "logical size" of the container, creating (by default construction) new entries, or removing (with destruction) entries. Reserve does not change the "logical size", and it's only use is as an implementation optimization (you can pre-assign internal buffer space, so that when adding new entries later on a memory allocation will already have occurred).
For a vector, you can create one and then reserve one all you want, but the size is still 0 (until "push_back" or "insert", etc is performed), and indexing into the vector will be out of bounds.
Read Josuttis C++ standard library book, or any good reference on the difference.
Cliff
Ok, so I't my fault ;) I use mainly online reference (sgi.com and cplusplus.com ) and the fact that reserve() does not initialize memory is not so obvious in these docs. So thank you for your help. Gaetan.
participants (4)
-
Cliff Green
-
Gaetan Gaumer
-
Gaetan Gaumer
-
Ion Gaztañaga