码迷,mamicode.com
首页 > 其他好文 > 详细

智能指针

时间:2016-04-05 14:15:28      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:智能指针

对于智能指针AutoPtr,一般有两种实现的方法,一种是s1与s2同时指向一个空间的时候,将s1置为空,这样就会避免析构的时候产生麻烦。

#include <iostream>

#include <string>

using namespace std;

template <class T>

class AutoPtr

{

protected:

T *_ptr;

public:

AutoPtr(T * ptr)

:_ptr(ptr)

{}

~AutoPtr()

{

if (_ptr)

{

cout << "delete" << endl;

delete _ptr;

}

}

AutoPtr(AutoPtr<T>& ap)

:_ptr(ap._ptr)

{

ap._ptr = NULL;

}

AutoPtr<T>operator=(AutoPtr <T> &ap)

{

if (this != &ap)

{

delete _ptr;

_ptr = ap._ptr;

ap._ptr = NULL;

}

return *this;

}

T &operator*()

{

return *_ptr;

}

T *operator->()

{

return _ptr;

}

};


第二种方法是s1与s2同时指向一个空间的时候,设立一个标志量_owner,将s1的_owner置为false,这样当析构的时候当_owner为true的时候再析构。

#include <iostream>

#include <string>

using namespace std;

template <class T>

class AutoPtr

{

private:

T *_ptr;

bool _owner;

public:

AutoPtr(T *ptr=new T(1))

:_ptr(ptr)

, _owner(true)

{

cout << "AutoPtr()" << endl;

}

~AutoPtr()

{

if (_ptr != NULL)

{

if (_owner == true)

{

delete _ptr;

cout << "~AutoPtr()" << endl;

}

}

}

AutoPtr(AutoPtr<T> &ap)

{

_ptr = ap._ptr;

_owner = true;

ap._owner = false;

}

AutoPtr<T>&operator=(AutoPtr<T> &ap)

{

if (this != &ap)

{

delete _ptr;

_ptr = sp._ptr;

_owner = true;

sp._owner = false;

}

}

};

void test()

{

AutoPtr<int> s1;

AutoPtr<int>s2(s1);

}

int main()

{

test();

getchar();

return 0;

}


智能指针

标签:智能指针

原文地址:http://10810512.blog.51cto.com/10800512/1760360

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!