my_auto_ptr通过它的析构函数来调用delete删除某对象的指针,来达到自动释放内存,而不需要显示的调用delete某对象。

(1)实现自动释放


#include <iostream>
#include <string>

using namespace std;

struct People
{
public:
People() {cout << "People" << endl;}
~People() {cout << "~People" << endl;}
void run(void) const {cout << "Peple can run!" << endl;}
};

class my_auto_ptr
{
public:
my_auto_ptr(People* p) : p(p) {}
~my_auto_ptr() {delete p;}
private:
People* p;
};

int main(int argc, char *argv[])
{
my_auto_ptr ptr(new People);

return 0;
}


程序输出:

People

~People

(2)实现调用该对象的成员


#include <iostream>
#include <string>

using namespace std;

struct People
{
public:
People() {cout << "People" << endl;}
~People() {cout << "~People" << endl;}
void run(void) const {cout << "Peple can run!" << endl;}
};

class my_auto_ptr
{
public:
my_auto_ptr(People* p) : p(p) {}
~my_auto_ptr() {delete p;}
People* operator->() const {cout << "->" << endl; return p;}
const People& operator*() const {cout << "*" << endl; return *p;}
const People* operator&() const {cout << "&" << endl; return p;}
private:
People* p;
};

int main(int argc, char *argv[])
{
my_auto_ptr ptr(new People);

ptr->run();
(*ptr).run();
&ptr;

return 0;
}

/*
总结:

ptr->run();
这里ptr是一个my_auto_ptr对象,p->run的含义与(p.operator->())->run求值相同。
p.operator->()返回对People对象的指针,然后对返回的People调用run()函数。
*/


程序输出:

 People

->

Peple can run!

*

Peple can run!

&

~People

(3)实现泛型版本



#include <iostream>
#include <string>

using namespace std;

struct People
{
public:
People() {cout << "People" << endl;}
~People() {cout << "~People" << endl;}
void run(void) const {cout << "Peple can run!" << endl;}
};

class Student {};

template<typename T>
class my_auto_ptr
{
public:
my_auto_ptr(T* p) : p(p) {}
~my_auto_ptr() {delete p;}
T* operator->() const {cout << "->" << endl; return p;}
const T& operator*() const {cout << "*" << endl; return *p;}
private:
T* p;
};

int main(int argc, char *argv[])
{
my_auto_ptr<People> ptr1(new People);
my_auto_ptr<Student> ptr2(new Student);

return 0;
}