【问题标题】:What is the difference between initializing shared_ptr with just another pointer and initializing it with the get method?用另一个指针初始化 shared_ptr 和用 get 方法初始化它有什么区别?
【发布时间】:2023-02-21 20:48:33
【问题描述】:

有一个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指针一样。在进程函数内部,计数器将为 2,离开函数后,p 将是唯一的指针,计数器将为 1。一切似乎都是正确的。如我错了请纠正我

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

【问题讨论】:

  • “无法正确编译代码”是什么意思? “无法弄清楚 get 方法的用途”是什么意思,难道你的 C++ 教科书在讨论 shared_ptr 的同一章中没有解释 get() 的作用及其工作原理吗?
  • 第二种情况是错误的,将导致两次删除 int 对象。没有必要在上面浪费时间,只是避免这样做。
  • 当你执行 std::shared_ptr&lt;int&gt;(p.get()) 时,一旦新的共享指针对象被破坏,内存会发生什么? p 指向的指针会发生什么?请记住,您将拥有两个不同且不同的 shared_ptr 对象,但它们都指向同一内存不是他们之间共享。
  • 它调用两个不同的构造函数,一个来自另一个 shared_pointer,一个来自原始指针。第 8 名与第 3 名:en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr。它们都有效,但对该指针的所有权有不同的含义。
  • @Someprogrammerdude 为什么它们是对同一内存的不同引用?如果我理解正确,当你只使用 p 创建一个临时指针时,你实际上传递了 int 对象的地址,或者没有?而在第二种情况下,当使用get方法时,会返回int对象的地址并创建临时指针。那么为什么结果不同呢?那么 p 和 p.get() 有什么区别呢?

标签: c++


【解决方案1】:

让我们来说明一下:

您创建一个指向 int 值的指针:

int* p1 = new int(some_value);

这看起来像这样:

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

然后你正在做的是创建第二个指针,初始化为指向相同的位置:

int* p2 = p1;

然后看起来像这样:

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

这就是当你做shared_ptr&lt;int&gt;(p.get())时真正发生的事情。

现在让我们删除第二个指针:

delete p2;

这种删除是在临时共享对象被破坏时发生的。这给你留下了这个:

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

因为分配给p1的内存被p2删除了。


使用您的代码,您可以创建两个不同的指针,它们都指向同一内存但不共享任何状态。两个智能指针都会认为他们拥有内存的独占所有权,他们对彼此一无所知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多