私は C++ で乱数ジェネレーターを作成しようとしていますが、大きすぎるベクトルをコピーしないようにするために、それらへのポインターを渡したいと考えていました。私はガベージコレクションを自分で処理したくありません。それが私がshared_ptrを使いたい理由です(私は初心者なので、私のアプローチは不器用であるか、問題に適合していない可能性があります)。今、ベクトルを検索したいのですが、shared_ptr と shared_ptr.get() の奇妙な動作がそれぞれあります。正しい解決策が見つからないか (コード スニペットを参照)、
MonteCarlo.exe の 0x0131F5DA での初回例外: 0xC0000005: アクセス違反の読み取り場所 0x00000008。
他の場合。位置が 0 (= null ポインター) に近いことがわかりますが、なぜですか?
標準ポインタを使用すると、正しい結果が得られます。ここに私のコードスニペット:
#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;
出力:
うん
はい2
では、 yeah3が表示されないのはなぜですか。typeidは同じです...または少なくともyes4であり、これも通常のポインターです。私が理解していないshared_pointersについていくつかの理論があると思います...
64 ビット Windows 7 で VS 2012 Express を使用しています。