c++ 用另一个指针初始化shared_ptr和用get方法初始化shared_ptr有什么区别?

pftdvrlh  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(155)

有一个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。所有内容似乎都是正确的。如果我说错了,请纠正我

在第二种情况下会发生什么我还不清楚,我想弄清楚。

fiei3ece

fiei3ece1#

让我们举例说明:
创建指向int值的指针:

int* p1 = new int(some_value);

它看起来像这样:

+----+      +------------------+
| p1 | ---> | int (some_value) |
+----+      +------------------+

然后你要做的就是创建第二个指针,初始化为指向同一个位置:

int* p2 = p1;

它看起来就像这样:

+----+
| p1 | -\
+----+  |    +------------------+
         >-> | int (some_value) |
+----+  |    +------------------+
| p2 | -/
+----+

这就是shared_ptr<int>(p.get())的真实情况。
现在让我们删除第二个指针:

delete p2;

这种删除是在临时共享对象被析构时发生的,这就给你留下了这样的结果:

+----+      
| p1 | ---> ???
+----+

因为分配给p1的存储器是使用p2删除的。
你的代码创建了两个截然不同的指针,它们都指向同一个内存,但不共享任何状态,这两个智能指针都认为它们拥有内存的独占所有权,它们对彼此一无所知。
在一个 * 非常 * 简化的级别上,共享指针及其get函数的工作原理如下:

template<typename T>
class shared_ptr
{
public:
    shared_ptr() = default;  // Defaulted default constructor

    shared_ptr(T* raw);  // Constructor using raw pointers
        : raw_{ raw }    // Example usage: shared_ptr<int> p(new int)
    {
    }

    T* get()
    {
        return raw_;  // Returns the raw pointer
    }

private:
    T* raw_ = nullptr;  // The actual raw pointer
};

get函数只返回原始的非托管指针,任何使用这种原始非托管指针的构造都只是复制指针本身,因为没有关于所有权的信息,也没有关于它是另一个共享指针的一部分的信息。

相关问题