Почему общий указатель C ++ не ведет себя как стандартный указатель для итераторов?

Я собираюсь сделать генератор случайных чисел в 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.

5

Решение

Посмотрите, как вы настроили 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и не должно быть.

Надеюсь это поможет!

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector