gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:11 25 4
gpt4 key购买 nike

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

First-chance exception at 0x0131F5DA in MonteCarlo.exe: 0xC0000005: Access violation reading location 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;

输出:

是的

是啊2

那么为什么 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,也不应该是。

希望这对您有所帮助!

关于c++ - 为什么 C++ 共享指针的行为不像迭代器的标准指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com