Я собираюсь сделать генератор случайных чисел в C ++, и чтобы избежать копирования слишком больших векторов, я хотел передать им указатели. Я не хочу заботиться о сборке мусора самостоятельно. Вот почему я хочу использовать shared_ptr (я могу добавить, что я новичок, поэтому, возможно, мой подход неуклюжий / не подходит для этой проблемы.). Теперь я хочу найти вектор, но есть странное поведение shared_ptr и shared_ptr.get () соответственно: либо они не находят правильного решения (см. Фрагмент кода), либо даже бросают
Исключение первого шанса в 0x0131F5DA в MonteCarlo.exe: 0xC0000005: место чтения нарушения доступа 0x00000008.
в других случаях. Я вижу, что местоположение близко к 0 (= нулевой указатель), но почему?
Использование стандартных указателей дает правильные результаты.
Вот мой фрагмент кода:
#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;
Выход:
да уж
yeah2
Так почему не yeah3 объявиться? Для TypeId это то же самое … или по крайней мере yeah4, который снова является нормальным указателем. Я думаю, что есть некоторая теория о shared_pointers, которую я не понимаю …
Я использую VS 2012 Express на 64-битной Windows 7.
Посмотрите, как вы настроили shared_ptr
и нормально 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();
Вы никогда не вставляли ничего в vector
указал на ваш shared_ptr
так что правильное поведение здесь при выполнении binary_search
будет сообщать, что в vector
, Обратите внимание, что v
и vector
вы указываете не то же самое vector
и не должно быть.
Надеюсь это поможет!
Других решений пока нет …