C++my_auto_ptr类

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;
}

 

posted @ 2013-05-06 16:53  robotke1  阅读(158)  评论(0编辑  收藏  举报