I'm about to make a random number generator in C++ and in order to avoid copying too big vectors, I wanted to pass pointers to them. I don't want to take care of garbage collection myself. That's why I want to use shared_ptr (I may add that I'm a newby, so maybe my approach is clumsy/not fitted for the problem.). Now I want to search the vector but there is a strange behavior of shared_ptr and shared_ptr.get(), respectively: Either they do not find the right solution (see code snippet) or they even throw a
First-chance exception at 0x0131F5DA in MonteCarlo.exe: 0xC0000005: Access violation reading location 0x00000008.
in other cases. I see that the location is close to 0 (= null-pointer), but why?
Using standard pointers yields correct results. Here my code snippet:
#include <typeinfo>
#include <algorithm>
#include <vector>
#include <memory>
using namespace std;
int j = 3;
vector< int > v;
v.push_back(1);
v.push_back(3);
v.push_back(5);
vector< int >* v_pointer = &v;
shared_ptr<vector< int >> v_shared = make_shared<vector<int>>();
vector< int >* v_pointer_from_shared = v_shared.get();
// printing types of objects
cout << typeid(v.begin()).name() << endl;
cout << typeid(v_pointer->begin()).name() << endl;
cout << typeid(v_shared->begin()).name() << endl;
// do search
if (binary_search(v.begin(), v.end(), j)) cout << "yeah" << endl;
if (binary_search(v_pointer->begin(), v_pointer->end(), j)) cout << "yeah2" << endl;
if (binary_search(v_shared->begin(), v_shared->end(), j)) cout << "yeah3" << endl;
if (binary_search(v_pointer_from_shared->begin(), v_pointer_from_shared->end(), j)) cout << "yeah4" << endl;
Output:
yeah
yeah2
So why doesn't yeah3 show up? For the typeid is the same... or at least yeah4, which is again a normal pointer. I guess, there is some theory about shared_pointers which I don't understand...
I use VS 2012 Express on 64bit Windows 7.
Look at how you set up the shared_ptr and normal vector:
int j = 3;
vector< int > v;
v.push_back(1);
v.push_back(3);
v.push_back(5);
vector< int >* v_pointer = &v;
shared_ptr<vector< int >> v_shared = make_shared<vector<int>>();
vector< int >* v_pointer_from_shared = v_shared.get();
You've never inserted anything into the vector pointed at by your shared_ptr, so the correct behavior here when doing the binary_search would be to report that no values are present in the vector. Note that v and the vector you're pointing at aren't the same vector, nor should they be.
Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With