chromium中使用scoped_ptr

之前也总结过chromium中scoped_ptr的用法,我又看了下代码,chromium43对scoped_ptr又做了一些修改。我再写篇博客总结一下。写博客如果像代码管理系统一样有版本号,那就可以持续对一篇博客维护更新了。

scoped_ptr顾名思义,就是作用域中的智能指针。scoped_ptr获得一个指针指向对象的管理权,然后在scoped_ptr超出自己的作用域的时候自动销毁这个对象。

比如这个类:

scoped_ptr不能拷贝或者赋值,所以只能用在它的构造函数或者调用reset方法去接管一个对象的指针。

调用reset方法,scoped_ptr会销毁现有指针指向的对象,然后再管理新的对象的指针。可以用get获得对象的原始指针。

scoped_ptr可以通过release的方法返回自己管理的指针,之后自己不再管理这个指针了。这种情形下用户需要自己管理对象的生命周期,返回的指针需要用户自己管理,或者交给其他智能指针管理。

其实scoped_ptr跟c++11中的unique_ptr是非常类似的,scoped_ptr也实现了“移动但不能拷贝”的属性。你可以通过移动来转移对象,从而可以避免构造临时对象。

你可以通过Pass方法把一个scoped_ptr“转移”给另一个scoped_ptr,之前说scoped_ptr是不能拷贝或者赋值的。

get,release,Pass三者区别是:

  • get是获得原始指针,scoped_ptr还是继续管理着指针
  • release是获得原始指针,scoped_ptr不再管理指针
  • Pass是转移指针管理权到另外一个scoped_ptr,自己不再管理指针

Pass()可以正确的处理向上的类型转换,比如:

另外scoped_ptr还支持数组:

base库还提供了make_scoped_ptr的函数从原始指针中创建并返回一个scoped_ptr。

此外chromium中还有个ScopedVector。这个是对vector容器的封装,使其可以存放并管理对象指针,在ScopedVector超出作用域的时候销毁指针所指向的对象。

发表评论

电子邮件地址不会被公开。 必填项已用*标注