【问题标题】:How to assign the address to boost::shared_ptr in c++?如何在 c++ 中将地址分配给 boost::shared_ptr?
【发布时间】:2013-09-30 22:09:18
【问题描述】:

我有:

boost::shared_ptr<Car> sptr;

现在我想从其他对象分配一个地址:

Car object;
sptr = &object;//error

正如我们在评论中看到的那样,有一个错误。所以我的问题是如何将某个对象的地址分配给 shared_ptr? 如果它是正常的指针,情况将很简单:

Car *ptr;
Car object;
ptr = &object;//ok

在这种情况下如何使用 boost::shared_ptr?谢谢

【问题讨论】:

  • 如果boost 的作用类似于std,您想使用&amp;(sptr.get())
  • “正如我们在评论中看到的有一个错误。” 是的,有一个错误,但是,你没有添加 实际的错误信息。始终复制这些内容,因为它们可能包含有用的信息。在这种情况下,Dietmar 的答案包含所有重要内容,但您的下一个问题可能会更复杂一些。

标签: c++ boost shared-ptr


【解决方案1】:

可以通过将指针显式转换为boost::shared_ptr&lt;Car&gt; 来完成分配:

boost::shared_ptr<Car> sptr;
Car object;
sptr = boost::shared_ptr<Car>(&object);

但是,这将是一个非常糟糕的主意:

  1. sptr 的最后一个副本超出范围时,Car 将是deleted,但它永远不会是newed。尽管您可以通过使用合适的删除器(即不执行任何操作的删除器)来解决此问题,但这并没有真正的帮助:
  2. 由于object 存在于堆栈中,因此它会在超出范围时被销毁,而不是在sptr 的最后一个副本超出范围时被销毁。

您应该只使用共享指针管理堆上的对象。堆栈分配的对象和嵌入到其他对象中的对象都有自己的生命周期管理。

【讨论】:

  • 我注意到你和 Linuxios 的回答都使用了= boost::shared_ptr&lt;...&gt;()。除了个人喜好,还有什么不使用shared_ptr&lt;...&gt;::reset(Y * ptr) 的特殊原因吗?
  • @Zeta: reset() 也可以。构造boost::shared_ptr&lt;...&gt;() 将有机会传递一个删除器。然而,这本质上是个人品味。
【解决方案2】:

原始指针,例如Car*,可以指向另一个对象,无论它在哪里。它可以在堆栈上,也可以在堆上,没关系。原始指针不“拥有”对象——即。它不会清理对象——它只是说“对象在那边”。

智能指针,例如shared_ptr&lt;Car&gt;,试图“拥有”或“管理”该对象。该对象必须在堆上分配,并且可能使用new 分配。当 shared_ptr 超出范围时,它会通过deleteing 来清理 Car。因此,shared_ptr 只能保存堆分配的对象。

即:

Car foo;  // stack allocated
Car* p = &foo;   // points to the stack-allocated Car foo.
shared_ptr<Car> sp (new Car);  // heap-allocates a Car, and holds it in a smart ptr.
p = sp.get();  // p points to the heap-allocated Car held by sp.
shared_ptr<Car> sp2 (&foo);  // BAD.  it will compile, and die at runtime.

旁注:

shared_ptr 允许多个 shared_ptr 指向同一个对象,并且在所有 shared_ptr 都消失之前不会清理它。

当它超出范围并尝试删除堆栈分配的 Car 时,错误的 shared_ptr 使用将终止。这可能会给您带来误导性堆栈跟踪,并且难以调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多