C++ 中的引用是一种方便的构造,它允许我们简化以下 C 代码:
f(object *p){
//do something
}
int main(){
object* p = (object*) calloc(sizeof(object));
f(p);
}
到
f(object& o){
//do something
}
int main(){
object o = object();
f(o);
}
共享指针是 C++ 中简化内存管理的另一个便利。但是,我不确定如何将 shared_ptr
传递给像 f(object& o)
这样通过引用接受参数的函数?
f(object& o){
//do something
}
int main(){
shared_ptr<object> p (new object());
f(*p);
}
当共享指针的对象通过引用传递给函数时,共享指针会递增吗?
最佳答案
取一个shared_ptr
的值,引用计数会增加。当您 typedef
时,这会更容易:
typedef boost:shared_ptr<object> object_ptr;
void foo(object_ptr obj)
{
obj->/* stuff*/;
obj.reset(); //only resets this local copy, that means:
// reduce reference count (back to 1), and
// set obj to point at null.
}
int main(void)
{
object_ptr obj(new object());
foo(obj);
}
请记住引用是别名。当您通过引用传递时,您不是在传递指针、拷贝等……,而是在为另一个对象设置别名。 (实际上它们是作为指针实现的):
typedef boost:shared_ptr<object> object_ptr;
void foo(object_ptr& obj)
{
obj.reset(); // the references was never increased, since a copy has not
// been made, this *is* obj in main. so the reference
// goes to 0, and obj is deleted
}
int main(void)
{
object_ptr obj(new object);
foo(obj); // after this, obj has been reset!
}
永远记住 const
是正确的,以防止错误:
typedef boost:shared_ptr<object> object_ptr;
void foo(const object_ptr& obj)
{
obj.reset(); // cannot do!
}
int main(void)
{
object_ptr obj(new object);
foo(obj);
}
我认为您应该尽可能将智能指针作为引用传递,以避免无关的递增和递减(以及拷贝等)。
关于c++ - C++ 中的 shared_ptr 和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1402522/