如何在 c++ 中为 boost::shared_ptr 分配地址

How to assign the address to boost::shared_ptr in c++?

本文关键字:shared 分配 地址 ptr boost c++ 中为      更新时间:2023-10-16

我得到了:

boost::shared_ptr<Car> sptr;

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

Car object;
sptr = &object;//error

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

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

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

您可以通过将指针显式转换为boost::shared_ptr<Car>来使赋值工作:

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

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

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

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

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

智能指针,例如 shared_ptr<Car> ,尝试"拥有"或"管理"对象。 对象必须在堆上分配,并且可能使用 new 分配。 当shared_ptr超出范围时,它会通过delete来清理汽车。 因此,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_ptrs指向同一对象,并且在所有shared_ptrs都消失之前不会清理它。

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