繁体   English   中英

为什么C ++共享指针的行为不像迭代器的标准指针?

[英]Why does C++ shared pointer not behave like standard pointer for iterators?

我打算用C ++制作一个随机数生成器,为了避免复制太大的向量,我想把指针传递给它们。 我不想自己处理垃圾收集。 这就是为什么我想使用shared_ptr(我可能会补充说我是一个新手,所以也许我的方法是笨拙的/不适合这个问题。)。 现在我想搜索向量,但分别有一个奇怪的行为:shared_ptr和shared_ptr.get():他们找不到合适的解决方案(参见代码片段),或者他们甚至抛出一个

MonteCarlo.exe中0x0131F5DA的第一次机会异常: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的理论,我不明白......

我在64位Windows 7上使用VS 2012 Express。

看看你如何设置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();

您从未在shared_ptr指向的vector插入任何内容,因此在执行binary_search时,此处的正确行为是报告vector中不存在任何值。 请注意, v和您指向的vector不是相同的vector ,也不应该是vector

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM