我有一个现有的变量,例如

int a = 3;

我现在如何创建一个boost::shared_ptra 例如:

boost::shared_ptr< int > a_ptr = &a; // this doesn't work

===============>>#1 票数:44 已采纳

尽管您应该将变量放入创建时的托管指针中,以通过现有指针进行操作。

int *a=new int;
boost::shared_ptr<int> a_ptr(a);

就是说,您绝对不希望将堆栈变量放到shared_ptr中

如果由于某种原因某个函数使用了shared_ptr并且您只有一个堆栈变量,那么最好这样做:

int a=9;
boost::shared_ptr<int> a_ptr=boost::make_shared(a);

看这里:

http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/make_shared.html

同样值得一提的是,如果您能够使用shared_ptr,则它符合c ++ 11标准。 您可以在构建讨论中将auto与make_shared结合使用,例如Herb Sutter注释。

#include <memory>

int a=9;
auto a_ptr=std::make_shared(9);

===============>>#2 票数:33

首先,您会遇到一个错误,因为shared_ptr不会自动从适当类型的指针进行转换。 您必须明确声明您要执行的操作:

int a = 3;
::boost::shared_ptr< int > a_ptr(&a); // DO NOT DO THIS!

你还有另一个问题。 想象一下这段代码的效果:

int a = 3;
delete &a;

在我给出的第一个示例中,即使不是那么直接,也不可避免地会发生这种情况。 shared_ptr存在的全部理由是,当所有指向该指针的指针消失时,便删除它们。 当然,这将导致各种奇怪的行为。

您有两种方法可以解决此问题。 一种是创建可以删除的内容。 另一个是要确保shared_ptr实际上没有删除它指向的内容。 每种都有优点和缺点。

制作一些可以删除的东西:

优点:

  • 简单容易。
  • 您不必担心对象的生存期。

缺点:

  • 有点慢,因为它将涉及一堆或两个堆分配。
  • 结果的shared_ptr将引用一个副本,因此对a修改不会反映在它所指向的事物的值中。

怎么做:

::boost::shared_ptr<int> a_ptr(::boost::make_shared(a));

这非常类似于(并且也可以):

::boost::shared_ptr<int> a_ptr(new int(a));

但是效率更高一些。 ::boost::make_shared做一些魔术来分配连续内存中的引用计数和对象,从而节省了对分配器的调用并提高了引用的局部性。

做到这一点,以便shared_ptr实际上不会删除它指向的内容:

优点:

  • 速度更快,尽管它仍涉及引用计数的堆分配
  • 直接解决当前的问题(您要指向的内容无法删除)。
  • shared_ptr引用a ,因此,如果更改其值,则通过指针访问它的事物将看到新值。

缺点:

  • 需要更多了解shared_ptr工作原理,这意味着阅读您的代码的人也必须知道。
  • 如果您要指向的对象在指向该对象的所有shared_ptr指向对象之前就超出了范围,则这些指针将变得悬而未决,这很糟糕。
  • 前面的观点使此解决方案非常冒险 我通常会避免它。

怎么做:

函数之外的某个位置(可能在匿名名称空间中):

void do_nothing_deleter(int *)
{
    return;
}

然后在函数中:

int a = 3;
::boost::shared_ptr a_ptr(&a, do_nothing_deleter);

===============>>#3 票数:16

您编写的内容无法正常运行,因为您要查找的shared_ptr的构造函数是explicit ,因此您需要像这样编写它

boost::shared_ptr<int> a_ptr(&a); // Don't do that!

然而, 问题是, delete将在所存储的值被称为a_ptr 由于在您的示例中a具有自动存储期限,因此非常糟糕 因此,我们也传递了一个自定义删除器:

boost::shared_ptr<int> a_ptr(&a, noop_deleter);

C ++ 11的noop_deleter的实现:

auto noop_deleter = [](int*) {};

C ++ 03版本:

// Can't be put in local scope
struct {
    void
    operator()(int*) const
    {}
} noop_deleter;

===============>>#4 票数:8

您不能为现有变量创建boost :: shared_ptr。 在boost :: shared_ptr中存储的项目在创建时存储。

但是,您可以制作boost :: shared_ptr,它是现有变量的副本。

例如

int a = 3; // Existing variable
boost::shared_ptr<int> aCopy = boost::make_shared<int>(a); //Create copy with value of a

请注意,您需要为<boost/make_shared.hpp>包括<boost/make_shared.hpp>

  ask by Bill Cheatham translate from so

未解决问题?本站智能推荐:

2回复

获取boost shared_ptr的指向类型

在我的项目中,我在一个头文件中使用boost :: shared_ptr写道: 在另一个源文件中,我使用它: 在#1中,我想编写queue_ptr的要键入的点,而不是 多久了! 但是boost :: shared_ptr中没有typedef,我发现的唯一一个是typ
2回复

将指针转换为boost :: shared_ptr

我有以下代码: 如何转换此行以使用boost::shared_ptr ? 每当我尝试shared_ptr<file_mapping>我都会在new操作符的右侧出现编译错误。
3回复

Boost shared_ptr不会立即销毁对象

我正在用C ++开发贝叶斯推理采样器,该采样器在树上进行很多中继,并且通过智能指针(Boost的shared_ptr和weak_ptr)来实现该树。 在推论过程中(即,运行一个长的C ++函数1-2分钟),该树正发生很大变化,从而创建并破坏了其许多节点。 整个推理过程(100%的负载
2回复

boost shared_ptr的自定义删除器

我有一个关于为boost::shared_ptr构造函数提供自定义delete方法的问题。 例如,我有一个GameObjectFactory类,它创建/销毁GameObjects 。 它有一个MemoryManager实例,可以Allocate()/Deallocate()内存。 Cr
2回复

哪个在Visual C ++ 2010上更快 - std :: shared_ptr或boost :: shared_ptr?

有没有人在发布模式版本中测试过这个? 或者实现如此相似,没有显着差异? 我对速度感兴趣: 创建一个新的shared_ptr 创建shared_ptr的副本 取消引用指针以访问指针对象 这将是针对速度优化的发布版本,使用make_shared()创建新的s
1回复

做boost :: shared_ptr 和boost :: shared_ptr 分享参考计数?

关于boost::shared_ptr的陷阱有几个有趣的问题。 在它们中的一个,有有用的技巧,以避免指向boost::shared_ptr<Base>和boost::shared_ptr<Derived>到类型的相同的对象Derived ,因为它们使用不同的引用计数,并
2回复

在这种情况下,如何使用boost的shared_ptr?

我有2个班级A和B。 在A类中,我在B上有一个称为Bptr的指针。 我在A的构造函数中为Bptr分配内存,并在A的析构函数中释放Bptr的内存。 如何将Boost集成到代码中并使用智能指针: boost :: shared_ptr ? 我的代码看起来如何? 非常感谢!
3回复

为什么不能将intrusive_ptr和shared_ptr与boost :: intrusive容器一起使用?

boost :: intrusive文档描述了如何使用带有侵入式容器的智能指针,但后来说你不能使用你最有可能使用的智能指针,“它必须具有与原始指针相同的所有权语义。意味着不能使用资源管理智能指针(如boost :: shared_ptr)。“ 为什么是这样? 我想不出他们应该被禁止的任何
6回复

什么是boost的shared_ptr(shared_ptr const&r,T * p)用于?

boost::shared_ptr有一个不寻常的构造函数 我对这对什么有用感到有些疑惑。 基本上它与r共享所有权,但.get()将返回p 。 不是 r.get() ! 这意味着您可以执行以下操作: 你会得到这个: 请注意,指针是分开的,但它们都声称use_cou
4回复

shared_ptr在哪里?

经过几个小时试图找到shared_ptr所在的位置后,我现在非常沮丧。 我看到的所有示例都没有显示包含shared_ptr (和工作)标头的完整代码。 简单地说明std , tr1和<memory>根本没有帮助! 我已经下载了增强功能,但仍然没有显示! 有人可以通过告诉确切的