【问题标题】:c++ auto_ptr destroyed when passed into a functionc ++ auto_ptr在传递给函数时被破坏
【发布时间】:2020-07-28 08:57:44
【问题描述】:

假设我们有

void UsePointer (auto_ptr <CSomeClass> spObj)
{
    spObj->DoSomething();
}

我们有一个主函数:

int main()
{
    auto_ptr <CSomeClass> spObject (new CSomeClass ());
    UsePointer (spObject);
    // spObject->DoSomthing (); would be invalid.
}

书上说“对象在 UsePointer() 返回时被销毁,因为变量 spObj 超出范围,因此被销毁”

我的问题是:

  1. 传递到 UsePointer 函数时是否复制了指针?因此所有权转移?
  2. 如果不希望 spObject 被破坏,我需要做什么?我需要通过引用传递这个指针吗?

这本书也有点过时了 - c++ 11 中的 unique_ptr 也一样吗?

【问题讨论】:

  • 忘记std::auto_ptr曾经存在过。只是很糟糕。
  • @Yksisarvinen 如果我们将 auto_ptr 更改为 unique_ptr,std::unique_ptr 的行为是否相同?
  • 无论您使用的是 auto_ptr 还是 unique_ptr,如果您不更改引用计数,则没有理由将其传递给函数。只传递原始指针更有效。另请参阅herbsutter.com/2013/06/05/…,是的,我同意@Yksisarvinen,不要使用 auto_ptr
  • 关于您的问题 - unique_ptr 不会编译 snd 报告和错误。 unique_ptr 顾名思义是“唯一的”,同一个对象不能有两个 unique_ptr。 shared_ptr 有引用计数器,可以复制。

标签: c++ smart-pointers unique-ptr auto-ptr


【解决方案1】:

指针传递到 UsePointer 函数时是否被复制?因此所有权转移?

是的。除非函数参数是引用限定的,否则参数按值传递。对于auto_ptr,涉及复制,从而传递所有权。

如果不希望 spObject 被破坏,我需要做什么?我需要通过引用传递这个指针吗?

你可以。但更好的是,传递对对象本身的引用。除非涉及对所有权的操作,否则函数不应接受智能指针。如果它只需要对指针做某事,请接受 CSomeClass const&amp; 并传递 *spObject

这本书也有点过时了 - c++ 11 中的 unique_ptr 也一样吗?

是的。不同之处在于unique_ptr 不可复制,因此不能隐式传递其所有权。要传递unique_ptr,必须显式移动它。 std:move 在将指针传递给函数的代码中的出现给出了所有权更改的明确视觉提示。

【讨论】:

  • 我没有 100% 理解最后一点——如果我们有“void UsePointer (auto_ptr spObj)”会发生什么——对象被破坏了吗? (或者这个用例是完全禁止的,因为)
  • @Lost1 - 我不确定我是否理解你。函数参数spObj仅在函数调用期间存在。当函数返回时,参数被销毁。如果参数被初始化为拥有指向另一个对象的指针,那么该对象也会与参数一起被销毁。这对于auto_ptrunique_ptr 都是一样的。唯一的区别在于它们如何被初始化。
  • 我的意思是 - 因为无法复制 unique_ptr,所以不允许使用“void UsePointer (unique_ptr spObj)”?
  • 我猜stackoverflow.com/questions/30905487/… 回答了我的问题?
  • @Lost1 - 当然不是不允许的。您可以声明该函数并调用它就好了。唯一的区别是构造函数参数需要传入UsePointer(std::move(spObject));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2020-12-10
相关资源
最近更新 更多