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

原文链接: https://www.cnblogs.com/Robotke1/archive/2013/05/06/3063103.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/87306

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午11:02
下一篇 2023年2月9日 下午11:02

相关推荐