C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了shared_ptr和C中的引用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
C中的引用是一个convneint结构,允许我们简化以下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 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!
}

永远记住要正确,以防止错误

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);
}

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

大佬总结

以上是大佬教程为你收集整理的shared_ptr和C中的引用全部内容,希望文章能够帮你解决shared_ptr和C中的引用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: