如何在 c++ 中为 boost::shared_ptr 分配地址
How to assign the address to boost::shared_ptr in c++?
我得到了:
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);
但是,这将是一个非常糟糕的主意:
- 当
sptr
的最后一个副本超出范围时,Car
将被delete
d,但它从未被new
编辑。尽管您可以通过使用合适的删除器(即不执行任何操作的删除器)来解决此问题,但这并没有真正的帮助: - 由于
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使用将死亡。 这可能会给您带来误导性的堆栈跟踪,并且难以调试。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源