Bil*_*ham 29 c++ boost smart-pointers shared-ptr
我有一个现有的变量,例如
int a = 3;
Run Code Online (Sandbox Code Playgroud)
我现在如何才能创建一个boost::shared_ptr
到a
?例如:
boost::shared_ptr< int > a_ptr = &a; // this doesn't work
Run Code Online (Sandbox Code Playgroud)
111*_*111 44
虽然您应该将变量放入其创建的托管指针中,以便从现有指针执行此操作.
int *a=new int;
boost::shared_ptr<int> a_ptr(a);
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因某个函数需要shared_ptr而你只有一个堆栈可变,你最好这样做:
int a=9;
boost::shared_ptr<int> a_ptr=boost::make_shared(a);
Run Code Online (Sandbox Code Playgroud)
看这里:
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);
Run Code Online (Sandbox Code Playgroud)
Omn*_*ous 33
首先,您有一个错误,因为它shared_ptr
不会自动从适当类型的指针转换.你必须明确说明你想做的事情:
int a = 3;
::boost::shared_ptr< int > a_ptr(&a); // DO NOT DO THIS!
Run Code Online (Sandbox Code Playgroud)
你有另一个问题.想象一下这段代码的效果:
int a = 3;
delete &a;
Run Code Online (Sandbox Code Playgroud)
在我给出的第一个例子中,这将不可避免地发生,即使它不是那么直接.shared_ptr
存在的全部理由是当所有指针都消失时删除它.当然,这会引起各种奇怪的行为.
您有两种方法来处理此问题.一个是创建可以删除的东西.另一个是确保shared_ptr
实际上不删除它指向的东西.各有利弊.
优点:
缺点:
shared_ptr
将引用一个副本,因此修改a
将不会反映在它指向的事物的值中.怎么做:
::boost::shared_ptr<int> a_ptr(::boost::make_shared(a));
Run Code Online (Sandbox Code Playgroud)
这非常相似(这也可以):
::boost::shared_ptr<int> a_ptr(new int(a));
Run Code Online (Sandbox Code Playgroud)
但它的效率稍高.::boost::make_shared
在连续内存中分配引用计数和对象可以节省一些魔力,从而节省了对分配器的调用并提高了引用的局部性.
shared_ptr
做实际上并没有删除它指向的内容:优点:
shared_ptr
指a
,所以如果你改变通过指针访问它的价值的东西会看到新的价值.缺点:
shared_ptr
工作的信息,这意味着阅读代码的人也必须知道.shared_ptr
指向它之前超出了范围,那么这些指针就会变得晃来晃去,这很糟糕.怎么做:
函数外的某个地方(可能在匿名命名空间中):
void do_nothing_deleter(int *)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
然后在功能中:
int a = 3;
::boost::shared_ptr a_ptr(&a, do_nothing_deleter);
Run Code Online (Sandbox Code Playgroud)
Luc*_*ton 16
你写的东西不会起作用,因为shared_ptr
你正在寻找的构造函数是explicit
,所以你需要这样写
boost::shared_ptr<int> a_ptr(&a); // Don't do that!
Run Code Online (Sandbox Code Playgroud)
这个问题是然而,就是delete
将上存储的值调用a_ptr
.由于在您的示例中a
具有自动存储持续时间,因此非常糟糕.所以我们也传递了一个自定义删除器:
boost::shared_ptr<int> a_ptr(&a, noop_deleter);
Run Code Online (Sandbox Code Playgroud)
的实现noop_deleter
为C++ 11:
auto noop_deleter = [](int*) {};
Run Code Online (Sandbox Code Playgroud)
C++ 03版:
// Can't be put in local scope
struct {
void
operator()(int*) const
{}
} noop_deleter;
Run Code Online (Sandbox Code Playgroud)
您无法为现有变量创建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
Run Code Online (Sandbox Code Playgroud)
请注意,您需要包含<boost/make_shared.hpp>
make_shared.
归档时间: |
|
查看次数: |
41344 次 |
最近记录: |