shared_ptr和C++中的引用

dzh*_*lil 7 c++ boost smart-pointers shared-ptr

C++中的引用是一个convneint结构,允许我们简化以下C代码:

f(object *p){
  //do something
}

int main(){
  object* p = (object*) calloc(sizeof(object));
  f(p);
}
Run Code Online (Sandbox Code Playgroud)

f(object& o){
  //do something
}

int main(){
  object o = object();
  f(o);
}
Run Code Online (Sandbox Code Playgroud)

共享指针是C++中另一种简化内存管理的便利.但是,我不知道如何将shared_ptr一个函数传递给一个f(object& o)通过引用接受参数的函数?

f(object& o){
  //do something
}

int main(){
  shared_ptr<object> p (new object());
  f(*p);
}
Run Code Online (Sandbox Code Playgroud)

当通过引用函数传递其对象时,共享指针是否会递增?

GMa*_*ckG 10

取一个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);
}
Run Code Online (Sandbox Code Playgroud)

请记住,引用是别名.当您通过引用传递时,您没有传递指针,副本等...,您正在别名另一个对象.(实际上它们是作为指针实现的):

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!
}
Run Code Online (Sandbox Code Playgroud)

永远记住要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);
}
Run Code Online (Sandbox Code Playgroud)

我认为您应该尽可能将智能指针作为引用传递,以避免无关的增量和减量(以及副本和诸如此类的东西).

  • ...并且如果函数实际上不需要智能指针(即它不会复制以供以后使用),则避免将智能指针作为参数传递. (3认同)