创建一个 boost::shared_ptr 到现有变量
我有一个现有变量,例如
int a = 3;
我现在如何创建一个 boost::shared_ptr
到 a
?例如:
boost::shared_ptr< int > a_ptr = &a; // this doesn't work
I have an existing variable, e.g.
int a = 3;
How can I now create a boost::shared_ptr
to a
? For example:
boost::shared_ptr< int > a_ptr = &a; // this doesn't work
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
尽管您应该在创建变量时将其放入托管指针中,以便从现有指针中执行此操作。
也就是说,您绝对不想将堆栈变量放入shared_ptr中,否则会发生不好的事情
如果由于某种原因,一个函数需要shared_ptr并且您只有一个堆栈变量,那么您最好这样做:
请参见此处:
http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/make_shared。 html
还值得注意的是,shared_ptr 属于 c++11 标准(如果您能够使用它)。您可以将 auto 与 make_shared 结合使用,就像 Herb Sutter 在构建谈话中指出的那样。
although you should put the variable into a managed pointer on it's creation to do it from an existing pointer.
That said you most definitely do not want to be putting stack variables into shared_ptr BAD THINGS WILL HAPPEN
If for some reason a function takes shared_ptr and you only have a stack varaible you are better off doing this:
See here:
http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/make_shared.html
also it is worth noting that shared_ptr is in the c++11 standard if you are able using that. You can use auto in combination with make_shared like Herb Sutter notes in the build talk.
首先,您会遇到错误,因为
shared_ptr
不会自动从适当类型的指针进行转换。您必须明确声明这就是您想要做的:不过您还有另一个问题。想象一下这段代码的效果:
在我给出的第一个例子中,这将不可避免地发生,即使它不是那么直接。
shared_ptr
存在的全部原因是当所有指向它的指针消失时删除它。当然,这会导致各种奇怪的行为。您有两种方法来处理这个问题。一是创建可以删除的东西。另一个是确保
shared_ptr
实际上不会删除它指向的东西。各有利弊。制作可以删除的东西:
优点:
缺点:
shared_ptr
将引用一个副本,因此对a
的修改不会反映在它所指向的事物的值中。如何做到这一点:
这与以下内容非常相似(并且这也可以工作):
但它的效率稍高一些。
::boost::make_shared
做了一些魔法来分配引用计数和连续内存中的对象,这节省了对分配器的调用并提高了引用的局部性。使
shared_ptr
实际上不会删除它指向的内容:优点:
shared_ptr
引用a
,因此,如果您更改其值,通过指针访问它的对象将看到新值。缺点:
shared_ptr
的工作原理,这意味着阅读您代码的人也必须了解。shared_ptr
之前超出了范围,那么这些指针就会变得悬空,这很糟糕。如何做到这一点:
在函数外部的某个地方(可能在匿名名称空间中):
然后在函数中:
First, you have an error because
shared_ptr
's will not automatically convert from a pointer of the appropriate type. You have to explicitly state that's what you want to do:You have another problem though. Imagine the effect of this code:
In the first example I gave, this will inevitably happen, even if it's not quite so direct.
shared_ptr
's whole reason for existence is deleting things when all the pointers to it go away. This, of course, will cause all manner of strange behavior.You have two ways of dealing with this issue. One is to create something that can be deleted. The other is to make sure that
shared_ptr
doesn't actually delete the thing it points to. There are pros and cons to each.Making something that can be deleted:
Pros:
Cons:
shared_ptr
will refer to a copy, so modifications toa
will not be reflected in the value of the thing it points to.How to do it:
This is rather similar to (and this will also work):
But it's slightly more efficient.
::boost::make_shared
does some magic to allocate the reference count and the object in contiguous memory which saves on calls to the allocator and improves locality of reference.Making it so that
shared_ptr
doesn't actually delete what it points to:Pros:
shared_ptr
refers toa
, so if you change its value things that access it through the pointer will see the new value.Cons:
shared_ptr
works, which means the people reading your code have to know too.shared_ptr
's that point to it do, then those pointers become dangling, and that's bad.How to do it:
Somewhere outside the function (probably in an anonymous namespace):
And then in the function:
您编写的内容将不起作用,因为您正在寻找的
shared_ptr
的构造函数是显式
,因此您需要像这样编写它的问题然而,
delete
将会在a_ptr
的存储值上调用。由于在您的示例中a
具有自动存储持续时间,因此这是非常糟糕。所以我们也传入一个自定义删除器:的
noop_deleter
实现:C++11: C++03 版本
What you wrote won't work because the constructor of
shared_ptr
you're looking for isexplicit
, so you'd need to write it like soThe problem with that however, is that
delete
will be called on the stored value ofa_ptr
. Since in your examplea
has automatic storage duration, this is very bad. So we pass in a custom deleter too:An implementation of
noop_deleter
for C++11:C++03 version:
您无法为现有变量创建 boost::shared_ptr。存储在 boost::shared_ptr 中的项目在创建时存储。
但是,您可以创建一个 boost::shared_ptr ,它是现有变量的副本。
例如,
请注意,您需要为 make_shared 包含
。You cannot create a boost::shared_ptr for an existing variable. Items stored in a boost::shared_ptr are stored at creation.
You can however make a boost::shared_ptr that is a copy of an existing variable.
For example
Note that you will need to include
<boost/make_shared.hpp>
for make_shared.