有一个process
函数:
void process(std::shared_ptr<int> sh_ptr) {}
两个process
函数调用之间的区别是什么?
std::shared_ptr<int> p(new int(42));
// process(std::shared_ptr<int>(p));
// process(std::shared_ptr<int>(p.get()));
您能解释一下这两个调用中到底发生了什么吗?我不知道get
方法是做什么的
**我的想法:**据我所知,第一次调用process
函数时传递给它一个临时指针shared_ptr,该指针指向int,就像p
指针一样。在process函数内部,计数器将为2,离开函数后,p
将是唯一的指针,计数器将为1。所有内容似乎都是正确的。如果我说错了,请纠正我
在第二种情况下会发生什么我还不清楚,我想弄清楚。
1条答案
按热度按时间fiei3ece1#
让我们举例说明:
创建指向
int
值的指针:它看起来像这样:
然后你要做的就是创建第二个指针,初始化为指向同一个位置:
它看起来就像这样:
这就是
shared_ptr<int>(p.get())
的真实情况。现在让我们删除第二个指针:
这种删除是在临时共享对象被析构时发生的,这就给你留下了这样的结果:
因为分配给
p1
的存储器是使用p2
删除的。你的代码创建了两个截然不同的指针,它们都指向同一个内存,但不共享任何状态,这两个智能指针都认为它们拥有内存的独占所有权,它们对彼此一无所知。
在一个 * 非常 * 简化的级别上,共享指针及其
get
函数的工作原理如下:get
函数只返回原始的非托管指针,任何使用这种原始非托管指针的构造都只是复制指针本身,因为没有关于所有权的信息,也没有关于它是另一个共享指针的一部分的信息。