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

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

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