出现智能指针的初衷?
C++ 没有虚拟机负责对象分配和释放的机制,需要程序员自己负责分配还是释放而手动释放会带来疏漏,因此就出现了能自动适当的对象的智能指针技术手段。
智能指针划分为两类。第一类智能指针引用的对象是可以共享的,也就是一个对象可以同时被多个智能指针引用。这类智能指针要求被引用的对象具有计数的功能,数值的大小就表示它目前被多少个智能指针引用。当一个对象的引用计数值等于0的时候,就表示它要被释放了。这类智能指针适合作为函数参数或者返回值在模块之间进行传递,从而实现共享。第二类智能指针不要求被引用对象具有计数的功能。
第二类智能指针引用的对象是独占的,也就是一个对象同一时刻只可以被一个智能指针引用。这类智能指针不要求被引用对象具有计数的功能。只要这类智能指针的生命周期超出了它自己的范围,那么它引用的对象就会被自动销毁。这类智能指针适合在函数或者内部使用,用来自动化释放那些不需要了的对象。此外,WebKit和Chromium还提供了弱智能指针。所谓弱智能指针,就是它们的存在不会影响到被引用对象的生命周期。它们适合用来解决对象之间存在循环引用时的释放问题。
- template<typename T>
- struct IsRefCounted {
- static const bool value = IsSubclass<T, RefCountedBase>::value
- || IsSubclass<T, ThreadSafeRefCountedBase>::value;
- };
Chromium的第一类智能指针由类scoped_refptr实现。由于它要求被引用对象具有计数功能,因此就提供了一个具有计数功能的基类RefCounted。当一个对象可以被类scoped_refptr描述的对象引用时,它就必须要从基类RefCounted继承下来。这一点与WebKit的第一类智能指针RefPtr是类似的。
Chromium的RefCounted类的实现如下所示:
- template <class T>
- class RefCounted : public subtle::RefCountedBase {
- public:
- RefCounted() {}
- void AddRef() const {
- subtle::RefCountedBase::AddRef();
- }
- void Release() const {
- if (subtle::RefCountedBase::Release()) {
- delete static_cast<const T*>(this);
- }
- }
- ......
- };
1.智能删除指针scoped_ptr
用作对普通指针的转储,防止忘记delete或不知道哪里delete。它跟引用计数没有关系。
头文件的注释就是使用示例
http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_ptr.h
template <class T, class D = base::DefaultDeleter<T> > class scoped_ptr
其中Deleter可以被替换,默认的Deleter区分是要delete普通指针还是指针数组,或者用free函数删除malloc的内存。