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超出作用域的时候销毁指针所指向的对象。 ... Read More | Share it now!

c++中的智能指针

内存管理是c++中比较棘手的问题。轻则是内存泄漏,重则是野指针、访问越界而崩溃,我们必须小心翼翼的对待指针。c++写多了,有时候会怀念java,c#这种有垃圾回收机制的语言,它们写出的代码是多么的干净优雅。 以前c++标准库里只有一个auto_ptr的智能指针,它的出现让我眼睛为之一亮,原来c++代码还可以这样管理指针啊。但是auto_ptr适应的场景有限,还有自己本身管理权转移晦涩的问题。 c++的准标准库boost为此准备了一组智能指针,scoped_ptr、socped_array、shared_ptr、shared_array、weak_ptr、intrusive_ptr。开源的浏览器chromium也有自己的智能指针解决方案linked_ptr、scoped_ptr、scoped_refptr、WeakPtr。c++... Read More | Share it now!

在chromium中使用智能指针

在chromium这种多进程,多线程,代码量巨大的工程里,很多对象的创建、使用和销毁往往不在一个地方,对象的生命周期管理起来非常困难。这种情况下智能指针就能派上用场了。智能指针本身是一个局部的对象,它管理着堆上分配的对象的指针,当智能指针超出作用域是,要么销毁管理的对象,要么交出对象的管理权,让其他智能指针接管对象。 使用的最多的是scoped_ptr,而ScopedVector是类似std::vector来包含指针的容器,在他内部就是一个std::vector<T*>... Read More | Share it now!

chromium中的智能指针scoped_ptr

scoped_ptr会管理指针,它在超出自己作用域的时候自动调用自己的析构函数去销毁指针。 scoped_ptr也可以管理数组。 把scoped_ptr当作参数或者返回值,也可以在函数中使用它。 Pass()可以正确的处理向上的类型转换,比如: 也可以使用PassAs()明确向上转换 注意,PassAs只对scoped_ptr<T>有效,不能用于scoped_ptr<T[]>。 ... Read More | Share it now!