我用智能指针重写我的代码。我有这种情况:
void Foo(SomeClass *p) { }
boost::shared_ptr<SomeClass> p(new SomeClass);
现在该做什么:从包装器(p.get()
)传递原始指针或重写函数参数并直接传递智能指针,如:
void Foo(boost::shared_ptr<Foo> obj) { }
我不确定。据我所知,智能指针应遵循一些指针,看看它是否仍然需要在程序中。所以我们可以传递原始指针。
答案 0 :(得分:5)
除非Foo
需要({共享)*p
的所有权,否则您应该保持签名相同并且只是通过p.get()
。这是最简单,最灵活的选择,同时也需要对现有代码进行最少的更改。
答案 1 :(得分:3)
如果您已经在重写代码以使用智能指针,那么您应该尽可能地删除普通/原始指针。
智能指针不会使用一些魔法来跟踪它们的内容(就像垃圾收集器一样),但它们使用一种相当简单的启发式方法来确定它们控制的对象是否应该被释放。不正确使用智能指针很容易打破这种启发式。
例如,shared_ptr
跟踪所有副本(直接或间接作为副本的副本),并在销毁最后一个副本时销毁受控对象。
如果您设法创建两个shared_ptr
来控制同一个对象但其中一个不是另一个的副本,那么这会破坏性。
答案 2 :(得分:2)
Foo
的参数是否为空?如果答案是否定的,那么你真的应该使用引用而不是指针:
void Foo(SomeClass &obj) { }
用法:
boost::shared_ptr<SomeClass> obj(new SomeClass);
Foo(*obj);
答案 3 :(得分:0)
如果你的函数只使用指针p来操作或读取SomeClass对象,你可以使用p.get()。如果指针p被分配给其他指针变量或类似变量,则应更改函数的签名。