4

I have got:

boost::shared_ptr<Car> sptr;

Now I would like to assign an address from other object:

Car object;
sptr = &object;//error

As we can see in the comment there is an error. So my question is how can I assign an address from some object to shared_ptr? If it was normal a pointer the case would be simply:

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

How to use in this case boost::shared_ptr? Thanks

4

2 回答 2

6

可以通过将指针显式转换为 a 来完成分配boost::shared_ptr<Car>

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

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

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

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

于 2013-09-30T22:18:02.173 回答
0

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

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

IE:

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 都消失之前不会清理它。

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

于 2013-09-30T22:24:06.920 回答