c++ - C++ 中的 shared_ptr 和引用

标签 c++ boost smart-pointers shared-ptr

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/

相关文章:

c++ - 带有派生对象的基类的 std::vector

c++ - 用C++加密字符串

C++ 析构函数异常

c++ - 如何从存档中检索 true_type?

c++ - 仅特化模板函数实现的一部分

c++ - 从带有原始指针的 vector 中删除 std::unique_ptr 的最佳方法?

c++ - libstdc++ 已弃用;移至 libc++ [-Wdeprecated] 但更改会产生编译错误

c++ - 使用 sprintf/printf 使用 %ld 格式字符串而不是 %d 和 int 数据类型的效果

c++ - Boost序列化数据标准

C++ 智能指针性能