以下代码摘录自More Effective C++
auto_ptr.h
#ifndef AUTO_PTR_H
#define AUTO_PTR_H
template<typename T>
class auto_ptr
{
public :
//使用explicit关键字避免隐式转换
explicit auto_ptr(T* p=0);
~auto_ptr();
//使用另一个类型兼容的auto_ptr来初始化一个新的auto_ptr
template<typename U>
auto_ptr(auto_ptr<U>& rhs);
template<typename U>
auto_ptr<T>& operator=(auto_ptr<U>& rhs);
T& operator*() const;
T* operator->() const;
//返回原始对象的指针
T* get() const;
//放弃指针的所以权
T* release();
//删除原有指针并获得指针的p的所有权
void reset(T* p=0);
private:
T* pointee;
};
template<typename T>
auto_ptr<T>::auto_ptr(T* p)
:pointee(p)
{}
template<typename T>
template<typename U>
auto_ptr<T>::auto_ptr(auto_ptr<U>& rhs)
:pointee(rhs.release())
{}
template<typename T>
auto_ptr<T>::~auto_ptr()
{
delete pointee;
}
template<typename T>
template<typename U>
auto_ptr<T>& auto_ptr<T>::operator=(auto_ptr<U>& rhs)
{
if(this!=&rhs)
reset(rhs.release());
return *this;
}
template<typename T>
T& auto_ptr<T>::operator*() const
{
return *pointee;
}
template<typename T>
T* auto_ptr<T>::operator->() const
{
return pointee;
}
template<typename T>
T* auto_ptr<T>::get() const
{
return pointee;
}
template<typename T>
T* auto_ptr<T>::release()
{
T* oldpointee=pointee;
pointee=0;
return oldpointee;
}
template<typename T>
void auto_ptr<T>::reset(T* p)
{
if(pointee!=p)
{
delete pointee;
pointee=p;
}
}
#endif
用来测试的Item类
//Item.h
#ifndef ITEM_H
#define ITEM_H
class Item
{
public:
Item(void);
~Item(void);
void PrintContent() const;
};
#endif
//Item.cpp
using std::cout;
using std::endl;
Item::Item(void)
{
}
Item::~Item(void)
{
cout<<"Destorying....."<<endl;
}
void Item::PrintContent() const
{
cout<<"Here is the content"<<endl;
}
main.cpp
#include <iostream>
#include "auto_ptr.h"
#include "Item.h"
using std::cout;
int main()
{
auto_ptr<Item> itemPtr(new Item);
itemPtr->PrintContent();
auto_ptr<Item> itemPtr2(itemPtr);
itemPtr2->PrintContent();
return 0;
}
运行程序,可以看到建在堆上的Item对象自动释放了,因为auto_ptr对象析构时将指针pointee delete了,同时结果如下:
Here is the content
Here is the content
Destorying.....
程序只会输出一句Destorying.....,因为在构造itemPtr2时,itemPtr的成员pointee指向的Item已经转交给了itemPtr2中的指针,
所以最后只会看到一句Destorying.....,也就是只有一个Item对象析构了...
原文链接: https://www.cnblogs.com/-Lei/archive/2012/08/31/2664732.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/61414
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!