智能指针的实现也是C++中的热点知识,它所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理,因此不用担心内存泄露的问题。智能指针经常出现在各种C++面试中,要求你说出智能指针的优缺点,甚至让你实现一份自己的智能指针。在C++编程领域里,有两份智能指针的实现:auto_ptr和shared_ptr。它们的声明方式如下:
auto_ptr<T> ptr
(new Y );
shared_ptr<T> ptr (new X);
智能指针并非完美无缺。比如auto_ptr,就存在下面一些问题:
1. auto_ptr不能共享所有权。
一旦智能指针被拷贝或者赋值,如:
auto_ptr <type> pt1(new type);
auto_ptr<type> pt2 = pt1; //拷贝
auto_ptr<type> pt3;
pt3 = pt1; //赋值
这样会导致pt2,pt3和pt1同时指向pt1内部的原始指针。由于每一个auto_ptr在被销毁时都会删除其所指之物,就意味着原始指针会被重复删除3次,造成严重后果。为了解决这个问题,要么禁用拷贝与赋值操作符,要么设计为当auto_ptr被拷贝或者赋值时对原始指针的拥有权转移到新对象上去。
2. auto_ptr不能指向数组。
3. auto_ptr不能作为容器的成员。
4. auto_ptr不能通过赋值操作来初始化:
std::auto_ptr<int> p(new int(42)); //对
std::auto_ptr<int> p = new int(42); //错
但是,在shared_ptr中,已经解决了auto_ptr中的大部分问题。很多朋友可能还不是很熟悉shared_ptr,其实它是Boost库中提供的一个新的智能指针,引用头文件为:#include<boost/shared_ptr.hpp>。Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,其成员已近2000人。 Boost库为大家带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。要使用Boost库,必须要先安装该库。
上面介绍并比较了智能指针的特点。实际上,auto_ptr和share_ptr都有现成的代码供大家阅读。但是为了锻炼大家面向对象的程序设计能力,下面给出一分关于智能指针的简单实现方法,以加深对C++编程的理解。
概括起来,指针的运算包含:“->”,“*”,“!”以及它的普通构造函数,拷贝构造函数,析构函数,以及赋值运算符。所以在智能指针中,需要实现这些基本功能。
template <class T>
class SmartPtr
{
public:
SmartPtr (T * realPtr =
0): pointee(realPtr)
{
}
SmartPtr(SmartPtr<T> &rhs);
~SmartPtr()
{
delete pointee;
}
SmartPtr &operator =
(SmartPtr<T> rhs);
T * operator->() const;
T& operator*() const;
bool operator!() const;
private:
T *pointee;
};
template <class T>
SmartPtr<T>::SmartPtr (SmatrtPtr<T> &rhs)
{
pointee = rhs.pointee;
//拥有权发生转移
rhs.pointee = NULL;
}
SmartPtr<T> & SmartPtr<T>::operator = (SmartPtr<T> &rhs)
{
If (this == &rhs)
return *this;
delete pointee;
pointee = rhs.pointee;
//拥有权发生转移
rhs.pointee = 0;
return *this;
}
T *SmartPtr<T>::operator->() const
{
return pointee;
}
T & SmartPtr<T>::operator *() const
{
return *pointee;
}
bool SmartPtr<T>::operator!() const
{
return pointee == NULL;
}
Copyright 2011-2020 © MallocFree. All rights reserved.