Chrome代码中大量运用了智能指针来管理对象的指针,解决对象生命期的问题。这篇文章尝试着理解Chrome中定义的几个智能指针类。
1. scoped_ptr/scoped_array/scopred_array_malloc
以scopred开头的智能指针类定义在/src/base/scoped_ptr.h文件中。它们有着很明确的设计目标,对new/new[]/malloc出来的对象指针进行简单的包装,来管理对象的内存分配和释放。比如scoped_ptr类对new/delete进行了简单的包装,提供类似于std::auto_ptr类似的接口,但是却摒弃std::auto_ptr设计中令人诟病的拷贝复制时被管理的对象转移的问题。简单的禁用拷贝和复制函数就可以达到此效果。所以它们的使用场合就非常明确和简单有限:
// {
// scoped_ptr<Foo> foo; // No pointer managed.
// foo.reset(new Foo("wee")); // Now a pointer is managed.
// foo.reset(new Foo("wee2")); // Foo("wee") was destroyed.
// foo.reset(new Foo("wee3")); // Foo("wee2") was destroyed.
// foo->Method(); // Foo::Method() called.
// foo.get()->Method(); // Foo::Method() called.
// SomeFunc(foo.Release()); // SomeFunc takes owernship, foo no longer
// // manages

本文探讨了Chrome代码中广泛使用的智能指针,包括scoped_ptr、scoped_array及其变种,以及引用计数的scoped_refptr。这些智能指针帮助管理对象生命周期,特别是通过RefCounted<T>类实现线程安全的引用计数。文章还比较了scoped_refptr与boost::shared_ptr的差异,并提及智能指针的拥有权策略。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



