我有:
boost::shared_ptr<Car> sptr;
现在我想从其他对象分配一个地址:
Car object;
sptr = &object;//error
正如我们在评论中看到的那样,有一个错误。所以我的问题是如何将某个对象的地址分配给shared_ptr? 如果它是正常的指针案例将是简单的:
Car *ptr;
Car object;
ptr = &object;//ok
如何在这种情况下使用boost :: shared_ptr?感谢
答案 0 :(得分:5)
您 可以通过显式将指针转换为boost::shared_ptr<Car>
boost::shared_ptr<Car> sptr;
Car object;
sptr = boost::shared_ptr<Car>(&object);
然而,这将是一个非常糟糕的主意:
sptr
的最后一个副本超出范围时,Car
将为delete
d,但它永远不会new
。虽然您可以通过使用合适的删除程序解决此问题,即不执行任何操作的删除程序,但这实际上没有帮助:object
存在于堆栈中,因此当它超出范围时会被销毁,而不会在sptr
的最后一个副本超出范围时销毁。您应该只使用共享指针管理堆上的对象。堆栈分配的对象和嵌入到其他对象中的对象都有自己的生命周期管理。
答案 1 :(得分:0)
原始指针,例如Car*
,可以指向另一个对象,无论它在哪里。它可以在堆栈上,也可以在堆上,没关系。原始指针不“拥有”对象 - 即。它不会清理对象 - 它只是说“对象在那边”。
智能指针,例如shared_ptr<Car>
,试图“拥有”或“管理”该对象。必须在堆上分配对象,并且可能使用new
进行分配。当shared_ptr超出范围时,它会通过delete
来清理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_ptrs指向同一个对象,并且在所有shared_ptrs都消失之前不会清理它。
错误的shared_ptr用法会在超出范围并尝试删除堆栈分配的Car时死亡。这可能会给你带来误导性的堆栈跟踪,并且难以调试。