5

私は 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 を使用しています。

4

1 に答える 1

3

shared_ptrと 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();

vectorが指す に何も挿入したことがないshared_ptrため、 を実行するときの正しい動作は、 にbinary_search値が存在しないことを報告することvectorです。あなたが指している と は同じではないことにv注意してください。vectorvector

お役に立てれば!

于 2013-05-29T19:27:32.963 に答える