【发布时间】: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<int>(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++